Isso não apenas altera o max_retries, mas também habilita uma estratégia de retirada que faz com que as solicitações para todos os endereços http: // sejam suspensas por um período de tempo antes de tentar novamente (no total 5 vezes):
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')
Conforme a documentação paraRetry
: se o backoff_factor for 0.1 , sleep () ficará suspenso por [0.1s, 0.2s, 0.4s, ...] entre tentativas. Também forçará uma nova tentativa se o código de status retornado for 500 , 502 , 503 ou 504 .
Várias outras opções para Retry
permitir um controle mais granular:
- total - número total de tentativas a serem permitidas.
- connect - Quantos erros relacionados à conexão devem ser tentados novamente.
- read - Quantas vezes para tentar novamente os erros de leitura.
- redirecionar - quantos redirecionamentos executar.
- method_whitelist - Conjunto de verbos de método HTTP em maiúsculas nos quais devemos tentar novamente.
- status_forcelist - Um conjunto de códigos de status HTTP nos quais devemos forçar uma nova tentativa.
- backoff_factor - Um fator de retirada para aplicar entre tentativas.
- raise_on_redirect - Se, se o número de redirecionamentos estiver esgotado, gerar um
MaxRetryError
ou retornar uma resposta com um código de resposta no intervalo 3xx .
- raise_on_status - significado semelhante ao raise_on_redirect : se devemos gerar uma exceção ou retornar uma resposta, se o status cair no intervalo status_forcelist e as tentativas foram esgotadas.
NB : raise_on_status é relativamente novo e ainda não foi lançado em urllib3 ou solicitações. Oargumento da palavra-chave raise_on_status parece ter entrado na biblioteca padrão no máximo na versão 3.6 do python.
Para fazer solicitações novamente em códigos de status HTTP específicos, use status_forcelist . Por exemplo, status_forcelist = [503] tentará novamente o código de status 503 (serviço indisponível).
Por padrão, a nova tentativa é acionada apenas para estas condições:
- Não foi possível obter uma conexão da piscina.
TimeoutError
HTTPException
gerado (de http.client no Python 3 else activationplib ). Parece haver exceções HTTP de baixo nível, como URL ou protocolo não formado corretamente.
SocketError
ProtocolError
Observe que essas são todas as exceções que impedem que uma resposta HTTP regular seja recebida. Se qualquer resposta regular for gerada, nenhuma nova tentativa será feita. Sem usar o status_forcelist , mesmo uma resposta com status 500 não será tentada novamente.
Para que ele se comporte de uma maneira mais intuitiva para trabalhar com uma API ou servidor da Web remoto, eu usaria o snippet de código acima, que força tentativas nos status 500 , 502 , 503 e 504 , os quais não são incomuns no web e (possivelmente) recuperável, devido a um período de retirada suficientemente grande.
EDITADO : Importar Retry
classe diretamente do urllib3 .