Il semble que chaque paramètre facultatif qui entre dans l'envoi soit également réglable sur la session (par exemple, vérifier, flux, etc.). Sauf délai d'attente.
Serait-il possible de modifier le comportement afin que le délai d'expiration soit fusionné à partir de la session comme tous les autres arguments ?
@ctheiss Hé, merci d'avoir soulevé ce problème !
C'est quelque chose qui est apparu auparavant, le plus récemment en #1987 mais aussi en #1130 et #1563 (toute cette année). Kenneth a généralement exprimé un manque d'intérêt pour ce changement, s'attendant à ce qu'il soit fait à l'aide d'adaptateurs de transport. Si vous souhaitez obtenir des conseils sur la façon de procéder, je serai ravi de vous aider, mais je ne pense pas que nous ajouterons timeout
aux Session
.
Désolé, nous ne pouvons pas être plus utiles !
Merci pour la réponse ultra rapide. Je dois m'améliorer dans la recherche des problèmes, car ceux que vous avez mentionnés sont des doublons exacts !
L'idée est-elle d'implémenter BaseAdapter
(ou la sous-classe HTTPAdapter
), puis d'associer la sous-classe à une session en utilisant mount
? Cela semble étrangement laborieux juste pour implémenter le "délai d'expiration par défaut" (étant donné à quel point tout le reste est incroyablement facile dans les requêtes).
L'idée serait de sous-classer HTTPAdapter
. Ce n'est pas très laborieux, vraiment, mais la principale raison pour laquelle nous le faisons est que cela maintient une distinction conceptuelle dans la bibliothèque. Session
objets
Pour clarifier, votre recommandation est que les gens fassent cela?
class MyHTTPAdapter(requests.adapters.HTTPAdapter):
def __init__(self, timeout=None, *args, **kwargs):
self.timeout = timeout
super(MyHTTPAdapter, self).__init__(*args, **kwargs)
def send(self, *args, **kwargs):
kwargs['timeout'] = self.timeout
return super(MyHTTPAdapter, self).send(*args, **kwargs)
s = requests.Session()
s.mount("http://", MyHTTPAdapter(timeout=10))
@staticshock c'est une option. Oui
Mais, plus précisément, est-ce la _recommandation_ ?
Il n'y a pas de recommandation spécifique car les besoins des utilisateurs varieront et il y aura une multitude de façons de résoudre ce problème pour ces utilisateurs.
@staticshock @sigmavirus24
Cette solution semble trop compliquée. Ce qui suit semble fonctionner pour moi.
s = requests.Session()
s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
# and this should succeed
s.get_orig('https://httpbin.org/delay/6')
@staticshock @sigmavirus24
Cette solution semble trop compliquée. Ce qui suit semble fonctionner pour moi.
s = requests.Session() s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3) # this should now timeout s.get('https://httpbin.org/delay/6') # and this should succeed s.get_orig('https://httpbin.org/delay/6')
Notez que vous devrez également appliquer cela aux autres verbes, par exemple post
, put
etc. si vous les utilisez. Pour être complet, voici ce que j'utilise :
session = requests.Session()
for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
setattr(session, method, functools.partial(getattr(session, method), timeout=5))
# All methods of session should now timeout after 5 seconds
Pourquoi ne pas simplement caler la méthode request
?
s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
Si vous en avez besoin globalement au niveau du module et que vous n'utilisez pas de sessions, vous pouvez potentiellement faire :
requests.api.request = functools.partial(requests.api.request, timeout=3)
Je ne sais pas comment cela joue avec son utilisation sur plusieurs modules, j'imagine que vous auriez besoin de la cale dans chaque fichier où vous utilisez des requêtes.
Commentaire le plus utile
Pourquoi ne pas simplement caler la méthode
request
?