366 votes

Puis-je définir max_retries pour les demandes.la demande?

Python demandes module est simple et élégant, mais une chose me chiffonne. Il est possible d'en obtenir une demande.exception à la règle.ConnectionError avec le message contenant qch comme: "maximum de tentatives de dépassement avec l'url...'

Cela implique que les demandes peuvent tenter d'accéder aux données à plusieurs reprises. Mais il n'y a pas une seule mention de cette possibilité n'importe où dans les docs. En regardant le code source je n'ai pas trouver un endroit où je pouvais modifier la valeur par défaut (sans doute de 0).

Ainsi est-il possible de faire en quelque sorte définir le nombre maximal de tentatives de demandes?

238voto

Martijn Pieters Points 271458

C'est le sous-jacent urllib3 bibliothèque qui ne le réessayer. Pour définir un autre nombre maximal de tentatives, l'utilisation des transports alternatifs cartes:

from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=5))

Vieille réponse, antérieure à la publication de demandes 1.2.1:

L' requests de bibliothèque n'a pas vraiment faire de cette configurable, ni d'intention (voir ce pull request). Actuellement (demandes 1.1), les tentatives de compteur est mis à 0. Si vous voulez vraiment de la régler à une valeur plus élevée, vous devez régler cela à l'échelle mondiale:

import requests

requests.adapters.DEFAULT_RETRIES = 5

Cette constante n'est pas documentée; vous l'utilisez à vos risques et périls que les versions futures pourraient changer la façon dont cela est traité.

Mise à jour: et ce n' changement; dans la version 1.2.1 le choix de l' max_retries paramètre sur l' HTTPAdapter() classe a été ajouté, de sorte que maintenant vous avez à utiliser les transports alternatifs adaptateurs, voir ci-dessus. Le singe-patch approche ne fonctionne plus, sauf si vous aussi le patch HTTPAdapter.__init__() par défaut (très déconseillé).

68voto

gizmondo Points 403

Attention, Martijn Pieters la réponse n'est pas adapté pour la version 1.2.1+. Vous ne pouvez pas définir de façon globale sans avoir à la bibliothèque.

Vous pouvez faire ceci à la place:

import requests
from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://www.github.com', HTTPAdapter(max_retries=5))
s.mount('https://www.github.com', HTTPAdapter(max_retries=5))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X