Esto no solo cambiará max_retries sino que también habilitará una estrategia de retroceso que hace que las solicitudes a todas las direcciones http: // se suspendan durante un período de tiempo antes de volver a intentarlo (hasta un total de 5 veces):
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')
De acuerdo con la documentación paraRetry
: si el backoff_factor es 0.1 , sleep () dormirá durante [0.1s, 0.2s, 0.4s, ...] entre reintentos. También forzará un nuevo intento si el código de estado devuelto es 500 , 502 , 503 o 504 .
Varias otras opciones para Retry
permitir un control más granular:
- total : número total de reintentos para permitir.
- connect : cuántos errores relacionados con la conexión hay que volver a intentar.
- leer : cuántas veces volver a intentar errores de lectura.
- redirigir : cuántos redireccionamientos realizar.
- method_whitelist - Conjunto de verbos de métodos HTTP en mayúsculas en los que deberíamos volver a intentar.
- status_forcelist : un conjunto de códigos de estado HTTP en los que deberíamos forzar un reintento.
- backoff_factor : un factor de retroceso para aplicar entre intentos.
- raise_on_redirect : si, si se agota el número de redireccionamientos, para elevar
MaxRetryError
o devolver una respuesta con un código de respuesta en el rango 3xx .
- raise_on_status: significado similar a raise_on_redirect : si debemos generar una excepción o devolver una respuesta, si el estado cae en el rango status_forcelist y los intentos se han agotado.
NB : raise_on_status es relativamente nuevo y aún no se ha convertido en una versión de urllib3 o solicitudes. Elargumento de la palabra clave raise_on_status parece haber llegado a la biblioteca estándar como máximo en python versión 3.6.
Para realizar solicitudes, vuelva a intentarlo con códigos de estado HTTP específicos, use status_forcelist . Por ejemplo, status_forcelist = [503] volverá a intentar el código de estado 503 (servicio no disponible).
De forma predeterminada, el reintento solo se activa para estas condiciones:
- No se pudo obtener una conexión desde el grupo.
TimeoutError
HTTPException
elevado (desde http.client en Python 3 más httplib ). Esto parece ser excepciones HTTP de bajo nivel, como URL o protocolo no formados correctamente.
SocketError
ProtocolError
Tenga en cuenta que estas son todas las excepciones que impiden recibir una respuesta HTTP normal. Si cualquiera se genera la respuesta normal, sin reintento está hecho. Sin usar el status_forcelist , incluso una respuesta con el estado 500 no se volverá a intentar.
Para que se comporte de una manera más intuitiva para trabajar con una API remota o un servidor web, usaría el fragmento de código anterior, que obliga a los reintentos en los estados 500 , 502 , 503 y 504 , todos los cuales no son infrecuentes en el web y (posiblemente) recuperable dado un período de retroceso lo suficientemente grande.
EDITADO : Importar Retry
clase directamente desde urllib3 .