← retour aux snippets

requests: session avec retries et timeouts

Configurer une session HTTP résiliente avec retries et timeouts.

objectif

Configurer une session HTTP résiliente avec retries et timeouts.

code minimal

import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter

def resilient_session(total=3, backoff=0.5, statuses=(500, 502, 503, 504)):
    retry = Retry(total=total, backoff_factor=backoff, status_forcelist=statuses, allowed_methods=["GET","POST","PUT","DELETE","HEAD","OPTIONS"])
    adapter = HTTPAdapter(max_retries=retry, pool_connections=10, pool_maxsize=10)
    s = requests.Session()
    s.mount("http://", adapter)
    s.mount("https://", adapter)
    orig = s.request
    def wrapped(method, url, **kw):
        timeout = kw.pop("timeout", 10)
        return orig(method, url, timeout=timeout, **kw)
    s.request = wrapped
    return s

if __name__ == "__main__":
    sess = resilient_session()
    adapter = sess.get_adapter("https://")
    print(hasattr(adapter, "max_retries"))  # attendu: True

utilisation

import requests
print(isinstance(requests.Session(), requests.Session))

variante(s) utile(s)

s = resilient_session(total=5, backoff=1.0)
print(s.get_adapter("http://").max_retries.total == 5)

notes

  • Toujours fixer un timeout; sinon, risque de blocage indéfini.
  • Limitez les méthodes retriées (idempotentes de préférence).