def __init__( self, retries: int = 3, backoff_factor: float = 0.3, status_to_retry: Tuple[int, ...] = (500, 502, 504), prefixes: Tuple[str, ...] = ("https://", ), ) -> None: self.session = Session() self.retries = retries retry_args = { "total": retries, "read": retries, "connect": retries, "backoff_factor": backoff_factor, "status_forcelist": status_to_retry, } if hasattr(Retry.DEFAULT, "allowed_methods"): retry_args.update({"allowed_methods": False}) else: retry_args.update({"method_whitelist": False}) r = Retry(**retry_args) adapter = HTTPAdapter(max_retries=r) for prefix in prefixes: self.session.mount(prefix, adapter) self.session.hooks = { "response": [lambda r, *args, **kwargs: r.raise_for_status()] }
def retry_requests( retries=3, backoff_factor=0.5, status_to_retry=(500, 502, 504), prefixes=("http://", "https://"), ): """Configures the passed-in session to retry on failed requests. The fails can be due to connection errors, specific HTTP response codes and 30X redirections. The original code is taken from: https://github.com/bustawin/retry-requests Parameters --------- retries : int The number of maximum retries before raising an exception. backoff_factor : float A factor used to compute the waiting time between retries. status_to_retry : tuple of ints A tuple of status codes that trigger the reply behaviour. Returns ------- session A session object with the retry setup. """ import requests from requests.adapters import HTTPAdapter from urllib3 import Retry session = requests.Session() r = Retry( total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_to_retry, method_whitelist=False, ) adapter = HTTPAdapter(max_retries=r) for prefix in prefixes: session.mount(prefix, adapter) session.hooks = { "response": lambda r, *args, **kwargs: r.raise_for_status() } return session
def __init__( self, retries: int = 3, backoff_factor: float = 0.3, status_to_retry: Tuple[int, ...] = (500, 502, 504), prefixes: Tuple[str, ...] = ("https://",), ) -> None: self.session = Session() self.retries = retries r = Retry( total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_to_retry, method_whitelist=False, ) adapter = HTTPAdapter(max_retries=r) for prefix in prefixes: self.session.mount(prefix, adapter) self.session.hooks = {"response": [lambda r, *args, **kwargs: r.raise_for_status()]}