Spowoduje to nie tylko zmianę max_retries, ale także włączenie strategii wycofywania, która powoduje, że żądania do wszystkich adresów http: // są uśpione przez pewien czas przed ponowną próbą (w sumie 5 razy):
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')
Zgodnie z dokumentacją dlaRetry
: jeśli współczynnik_offoff wynosi 0,1 , wówczas sleep () będzie spał przez [0,1s, 0,2s, 0,4s, ...] pomiędzy ponownymi próbami. Wymusi również ponowienie próby, jeśli zwrócony kod stanu to 500 , 502 , 503 lub 504 .
Różne inne opcje Retry
umożliwiające bardziej szczegółową kontrolę:
- ogółem - całkowita liczba ponownych prób dozwolonych.
- connect - ile błędów związanych z połączeniem należy ponowić.
- przeczytane - ile razy należy ponowić próbę w przypadku błędów odczytu.
- przekierowanie - Ile przekierowań wykonać.
- method_whitelist - Zestaw czasowników metod HTTP pisanych wielkimi literami, które powinniśmy spróbować ponownie.
- status_forcelist - zestaw kodów statusu HTTP, na które powinniśmy wymusić ponowienie.
- backoff_factor - Współczynnik wycofania stosowany między próbami.
- raise_on_redirect - czy, jeśli liczba przekierowań jest wyczerpana, aby podnieść
MaxRetryError
lub zwrócić odpowiedź z kodem odpowiedzi w 3xx .
- raise_on_status - Podobne znaczenie do raise_on_redirect : czy powinniśmy zgłosić wyjątek, czy zwrócić odpowiedź, jeśli status spadnie do zakresu status_forcelist i próby zostaną wyczerpane.
Uwaga : raise_on_status jest stosunkowo nowy i nie wydał jeszcze wersji urllib3 ani żądań. raise_on_status argumentem kluczowe wydaje się, że znalazły się w standardowej biblioteki Pythona co najwyżej w wersji 3.6.
Aby ponawiać żądania dla określonych kodów stanu HTTP, użyj status_forcelist . Na przykład status_forcelist = [503] spróbuje ponownie o kodzie stanu 503 (usługa niedostępna).
Domyślnie ponowna próba jest uruchamiana tylko dla następujących warunków:
- Nie można uzyskać połączenia z puli.
TimeoutError
HTTPException
podniesiony (z http.client w Pythonie 3 jeszcze httplib ). Wydaje się, że są to wyjątki HTTP niskiego poziomu, takie jak nieprawidłowy adres URL lub protokół.
SocketError
ProtocolError
Zauważ, że są to wszystkie wyjątki, które uniemożliwiają regularną odpowiedź HTTP. Jeśli zostanie wygenerowana jakakolwiek regularna odpowiedź, ponowna próba nie zostanie wykonana. Bez użycia status_forcelist nawet odpowiedź ze statusem 500 nie będzie ponawiana.
Aby działał w sposób bardziej intuicyjny w pracy ze zdalnym interfejsem API lub serwerem WWW, użyłbym powyższego fragmentu kodu, który wymusza ponawianie prób w stanach 500 , 502 , 503 i 504 , z których wszystkie nie są rzadkie w sieć i (ewentualnie) możliwe do odzyskania, biorąc pod uwagę wystarczająco duży okres wycofania.
EDYCJA : Importuj Retry
klasę bezpośrednio z urllib3 .