Cela changera non seulement les max_retries, mais activera également une stratégie d'interruption qui fait que les requêtes à toutes les adresses http: // dorment pendant un certain temps avant de réessayer (jusqu'à un total de 5 fois):
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')
Selon la documentation pourRetry
: si le backoff_factor est 0.1 , alors sleep () dormira pendant [0.1s, 0.2s, 0.4s, ...] entre les tentatives. Cela forcera également une nouvelle tentative si le code d'état renvoyé est 500 , 502 , 503 ou 504 .
Diverses autres options pour Retry
permettre un contrôle plus granulaire:
- total - Nombre total de tentatives à autoriser.
- connect - Combien d'erreurs liées à la connexion à réessayer.
- read - Combien de fois réessayer en cas d'erreurs de lecture.
- redirect - Combien de redirections à effectuer.
- method_whitelist - Ensemble de verbes de méthode HTTP en majuscules sur lesquels nous devons réessayer.
- status_forcelist - Un ensemble de codes d'état HTTP sur lesquels nous devrions forcer une nouvelle tentative.
- backoff_factor - Un facteur d' interruption à appliquer entre les tentatives.
- rise_on_redirect - Indique si, si le nombre de redirections est épuisé, pour lever un
MaxRetryError
, ou pour renvoyer une réponse avec un code de réponse dans la plage 3xx .
- rise_on_status - Sens similaire à rais_on_redirect : si nous devons lever une exception ou renvoyer une réponse, si le statut tombe dans la plage status_forcelist et que les tentatives ont été épuisées.
NB : rise_on_status est relativement nouveau, et n'en a pas encore fait une version d'urllib3 ou de requêtes. L'argument de mot-clé rise_on_status semble avoir été intégré dans la bibliothèque standard tout au plus dans la version 3.6 de python.
Pour faire des requêtes réessayer sur des codes d'état HTTP spécifiques, utilisez status_forcelist . Par exemple, status_forcelist = [503] réessayera sur le code d'état 503 (service non disponible).
Par défaut, la nouvelle tentative se déclenche uniquement pour ces conditions:
- Impossible d'obtenir une connexion depuis le pool.
TimeoutError
HTTPException
soulevé (à partir de http.client dans Python 3 sinon httplib ). Cela semble être des exceptions HTTP de bas niveau, comme une URL ou un protocole mal formé.
SocketError
ProtocolError
Notez que ce sont toutes des exceptions qui empêchent la réception d'une réponse HTTP régulière. Si une réponse régulière est générée, aucune nouvelle tentative n'est effectuée. Sans utiliser le status_forcelist , même une réponse avec le statut 500 ne sera pas retentée.
Pour qu'il se comporte d'une manière plus intuitive pour travailler avec une API ou un serveur Web distant, j'utiliserais l'extrait de code ci-dessus, qui force les tentatives sur les statuts 500 , 502 , 503 et 504 , qui ne sont pas rares sur le web et (éventuellement) récupérable étant donné une période d'attente suffisamment longue.
EDITED : Importez la Retry
classe directement depuis urllib3 .