Requests: Demande de fonctionnalité : ajouter un délai d'expiration à la session

Créé le 21 avr. 2014  ·  11Commentaires  ·  Source: psf/requests

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 ?

Commentaire le plus utile

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')

Tous les 11 commentaires

@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.

Cette page vous a été utile?
0 / 5 - 0 notes