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).