Volevo un timeout predefinito facilmente aggiunto a un mucchio di codice (supponendo che il timeout risolva il tuo problema)
Questa è la soluzione che ho preso da un ticket inviato al repository per le Richieste.
credito: https://github.com/kennethreitz/requests/issues/2011#issuecomment-477784399
La soluzione è l'ultima coppia di righe qui, ma mostro più codice per un contesto migliore. Mi piace usare una sessione per ritentare il comportamento.
import requests
import functools
from requests.adapters import HTTPAdapter,Retry
def requests_retry_session(
retries=10,
backoff_factor=2,
status_forcelist=(500, 502, 503, 504),
session=None,
) -> requests.Session:
session = session or requests.Session()
retry = Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=status_forcelist,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
# set default timeout
for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
setattr(session, method, functools.partial(getattr(session, method), timeout=30))
return session
allora puoi fare qualcosa del genere:
requests_session = requests_retry_session()
r = requests_session.get(url=url,...