Questo non solo cambierà i max_retries ma abiliterà anche una strategia di backoff che fa dormire tutte le richieste a tutti gli indirizzi http: // prima di riprovare (per un totale di 5 volte):
import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
s = requests.Session()
retries = Retry(total=5,
backoff_factor=0.1,
status_forcelist=[ 500, 502, 503, 504 ])
s.mount('http://', HTTPAdapter(max_retries=retries))
s.get('http://httpstat.us/500')
Come da documentazione perRetry
: se backoff_factor è 0.1 , sleep () dormirà per [0.1s, 0.2s, 0.4s, ...] tra i tentativi. Forzerà anche un nuovo tentativo se il codice di stato restituito è 500 , 502 , 503 o 504 .
Varie altre opzioni per Retry
consentire un controllo più granulare:
- totale : numero totale di tentativi da consentire.
- connect - Quanti errori relativi alla connessione su cui riprovare.
- read : quante volte riprovare a leggere errori.
- reindirizzamento : quanti reindirizzamenti eseguire.
- method_whitelist - Set di verbi del metodo HTTP maiuscoli su cui dovremmo riprovare.
- status_forcelist : un set di codici di stato HTTP su cui dovremmo forzare un nuovo tentativo.
- backoff_factor - Un fattore di backoff da applicare tra i tentativi.
- raise_on_redirect - Indica se, se il numero di reindirizzamenti è esaurito, per aumentare un
MaxRetryError
o per restituire una risposta con un codice di risposta nell'intervallo 3xx .
- raise_on_status - Significato simile a raise_on_redirect : se dovremmo sollevare un'eccezione o restituire una risposta, se lo stato rientra nell'intervallo status_forcelist e i tentativi sono stati esauriti.
NB : raise_on_status è relativamente nuovo e non è ancora diventato una versione di urllib3 o richieste. L'argomento della parola chiave raise_on_status sembra essere arrivato nella libreria standard al massimo nella versione 3.6 di Python.
Per fare di nuovo richieste su specifici codici di stato HTTP, utilizzare status_forcelist . Ad esempio, status_forcelist = [503] riproverà con il codice di stato 503 (servizio non disponibile).
Per impostazione predefinita, il nuovo tentativo si attiva solo per queste condizioni:
- Impossibile ottenere una connessione dal pool.
TimeoutError
HTTPException
generato (da http.client in Python 3 altro httplib ). Sembra che si tratti di eccezioni HTTP di basso livello, come URL o protocollo non formati correttamente.
SocketError
ProtocolError
Si noti che queste sono tutte eccezioni che impediscono la ricezione di una risposta HTTP normale. Se qualsiasi viene generato risposta regolare, nessun nuovo tentativo è fatto. Senza usare status_forcelist , anche una risposta con stato 500 non verrà ripetuta.
Per farlo funzionare in modo più intuitivo per lavorare con un'API o un server Web remoti, utilizzare lo snippet di codice sopra riportato, che forza i tentativi sugli stati 500 , 502 , 503 e 504 , che non sono rari nel web e (possibilmente) recuperabili dato un periodo di backoff abbastanza grande.
EDITED : importa la Retry
classe direttamente da urllib3 .