Dies ändert nicht nur die max_retries, sondern ermöglicht auch eine Backoff-Strategie, die Anforderungen an alle http: // Adressen für einen bestimmten Zeitraum in den Ruhezustand versetzt, bevor sie es erneut versuchen (insgesamt 5 Mal):
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')
Gemäß DokumentationRetry
: Wenn der backoff_factor ist 0,1 , dann sleep () wird tief und für [0,1s, 0,2s, 0,4s, ...] zwischen den Wiederholungen. Es wird auch ein erneuter Versuch erzwungen, wenn der zurückgegebene Statuscode 500 , 502 , 503 oder 504 lautet .
Verschiedene andere Optionen Retry
für eine detailliertere Steuerung:
- total - Gesamtzahl der zulässigen Wiederholungsversuche.
- connect - Wie viele verbindungsbezogene Fehler müssen wiederholt werden?
- read - Wie oft müssen Lesefehler wiederholt werden?
- Weiterleitung - Wie viele Weiterleitungen müssen ausgeführt werden?
- method_whitelist - Satz von HTTP-Methodenverben in Großbuchstaben, die wir erneut versuchen sollten.
- status_forcelist - Eine Reihe von HTTP-Statuscodes, für die ein sollte.
- backoff_factor - Ein Backoff-Faktor, der zwischen Versuchen angewendet werden soll .
- raise_on_redirect - Gibt an , ob bei erschöpfter Anzahl von Weiterleitungen
MaxRetryError
eine Antwort ausgelöst oder eine Antwort mit einem Antwortcode im Bereich 3xx zurückgegeben werden soll.
- raise_on_status - Ähnliche Bedeutung wie raise_on_redirect : Gibt an, ob eine Ausnahme ausgelöst oder eine Antwort zurückgegeben werden soll, wenn der Status in den Bereich status_forcelist fällt und die Wiederholungsversuche erschöpft sind.
NB : raise_on_status ist relativ neu und hat es noch nicht in eine Version von urllib3 oder Anfragen geschafft. DasSchlüsselwortargument raise_on_status scheint es in Python Version 3.6 höchstens in die Standardbibliothek geschafft zu haben.
Verwenden Sie status_forcelist, um Anforderungen für bestimmte HTTP-Statuscodes erneut auszuführen . Beispielsweise versucht status_forcelist = [503] den Statuscode 503 erneut (Dienst nicht verfügbar).
Standardmäßig wird der Wiederholungsversuch nur unter folgenden Bedingungen ausgelöst:
- Es konnte keine Verbindung aus dem Pool hergestellt werden.
TimeoutError
HTTPException
ausgelöst (von http.client in Python 3 sonst httplib ). Dies scheinen HTTP-Ausnahmen auf niedriger Ebene zu sein, z. B. URL oder Protokoll, die nicht korrekt gebildet wurden.
SocketError
ProtocolError
Beachten Sie, dass dies alles Ausnahmen sind, die den Empfang einer regulären HTTP-Antwort verhindern. Wenn eine regelmäßige Antwort generiert wird, wird kein erneuter Versuch durchgeführt. Ohne die status_forcelist zu verwenden wird auch eine Antwort mit Status 500 nicht wiederholt.
Um es auf eine Weise zu verhalten, die für die Arbeit mit einer Remote-API oder einem Webserver intuitiver ist, würde ich das obige Code-Snippet verwenden, das Wiederholungsversuche für die Status 500 , 502 , 503 und 504 erzwingt , die alle auf dem nicht ungewöhnlich sind Web und (möglicherweise) wiederherstellbar bei einer ausreichend großen Backoff-Periode.
BEARBEITET : Retry
Klasse direkt aus urllib3 importieren .