IT’s Portfolio

[Python] 파이썬 requests 모듈의 HTTPAdapter와 Retry 본문

Development Study/Python

[Python] 파이썬 requests 모듈의 HTTPAdapter와 Retry

f1r3_r41n 2021. 1. 6. 22:25
728x90
반응형

기본적인 웹 페이지 requests

def basic_req():
    print('basic_req, hello!')

    with requests.Session() as s:
        res = s.get("https://httpbin.org/get")
        print(res.status_code)
        print(res.headers)
        print(f"your ip is {res.json()['origin']}")

    print("================================")

 

 

HTTPAdapter를 사용하여 요청하는 requests

def adapter_req():
    print('adapter_req, hello!')

    with requests.Session() as s:
        adapter = HTTPAdapter(max_retries=3)

        s.mount("http://", adapter)
        s.mount("https://", adapter)

        res = s.get("https://httpbin.org/get")
        print(res.status_code)
        print(res.headers)
        print(f"your ip is {res.json()['origin']}")

    print("================================")

session.mount(prefix, adapter): http://https:// 라는 prefix를 붙인다.

이는 해당 세션을 사용하고 http://, https:// 로 시작하는 모든 주소에 대한 요청에 adapter를 마운트 한다는 의미이다.

 

결과는 기본 requests와 같다.

 

HTTPAdapter와 Retry를 사용하여 요청하는 requests

def retry_req():
    with requests.Session() as s:
        retries = 5
        backoff_factor = 0.3
        status_forcelist = (500, 502, 504)

        retry = Retry(
            total=retries,
            read=retries,
            connect=retries,
            backoff_factor=backoff_factor,
            status_forcelist=status_forcelist)

        adapter = HTTPAdapter(max_retries=retry)
        s.mount('http://', adapter)
        s.mount('https://', adapter)

        res = s.get("https://httpbin.org/get")
        print(res.status_code)
        print(res.headers)
        print(f"your ip is {res.json()['origin']}")

        print("================================")

파이썬으로 서버에게 요청을 보낼 때 서버가 죽었거나 정상이 아닐 때, 일정한 횟수로 Retry할 수 있도록 구현하는 것이 바람직하다. 때문에 HTTPAdapterRetry를 사용하여 코딩을 하는 것이 적합하다.

 

먼저 Session 객체와 Retry 객체를 생성하고 생성한 Session 객체에 HTTPAdapter 객체를 마운트 한 후 요청을 전송한다.

 

Retry 객체에서 total은 총 시도 횟수이며, backoff_factor는 재시도 횟수 간 대기 시간을 점차적으로 얼만큼의 크기만큼 늘릴지에 대한 설정, status_forcelist는 재시도를 해야하는 status code 튜플이다.

 

총 시도 횟수 공식: {backoff factor} * (2 ^ ({number of total retries} - 1))

requestsheader를 추가하고 싶다면, session.headers.update({'User-Agent': 'Mozilla/5.0 ~~~'}) 형태로 추가하면 된다.

 

Retry 객체를 생성할 때 total 파라미터에 재시도 횟수를 적어주는데 Retry, 즉 재시도이기 때문에 1을 기입하면 requests를 1번 보내고 실패했다면 1번 더 보내는것으로 생각했지만 실제로는 총 requests를 1번만 보낸다.

따라서 해당 파라미터는 총 시도 횟수라고 생각하는것이 좋다. 1번 requests를 보내고 실패했을 때 딱 한 번만 더 재시도를 진행하고 싶다면 total=2라고 적어줘야 한다.

 

마찬가지로 결과는 기본적인 requests와 같다.

728x90
반응형
Comments