Requests: Funktionsanfrage: Zeitüberschreitung zur Sitzung hinzufügen

Erstellt am 21. Apr. 2014  ·  11Kommentare  ·  Quelle: psf/requests

Es scheint, dass jeder optionale Parameter, der in send eingeht, auch in der Session einstellbar ist (zB Verify, Stream, etc.). Außer Zeitüberschreitung.

Wäre es möglich, das Verhalten so zu ändern, dass die Zeitüberschreitung genau wie alle anderen Argumente aus der Sitzung zusammengeführt wird?

Hilfreichster Kommentar

Warum nicht einfach die Methode request ?

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

Alle 11 Kommentare

@ctheiss Hey, danke, dass angesprochen hast !

Dies ist etwas, das schon einmal aufgetaucht ist, zuletzt in #1987, aber auch in #1130 und #1563 (das ganze Jahr). Kenneth hat im Allgemeinen ein mangelndes Interesse an dieser Änderung bekundet und erwartet, dass sie mit Transportadaptern durchgeführt wird. Wenn Sie daran interessiert sind, eine Anleitung dazu zu erhalten, helfe ich Ihnen gerne, aber ich glaube nicht, dass wir timeout zu den Session hinzufügen werden .

Es tut uns leid, dass wir nicht hilfreicher sein können!

Danke für die ultraschnelle Antwort. Ich muss besser darin werden, die Probleme zu durchsuchen, da die von Ihnen erwähnten exakten Duplikate sind!

Ist die Idee, BaseAdapter (oder Unterklasse HTTPAdapter ) zu implementieren und dann die Unterklasse mit mount einer Sitzung zuzuordnen? Das scheint seltsam mühsam, nur das "Standard-Timeout" zu implementieren (wenn man bedenkt, wie erstaunlich einfach alles andere in Anfragen ist).

Die Idee wäre, eine Unterklasse von HTTPAdapter erstellen. Es ist wirklich nicht sehr mühsam, aber der Hauptgrund, warum wir es tun, ist, dass es eine konzeptionelle Unterscheidung in der Bibliothek beibehält. Session Objekte sollten ausschließlich Dinge über die Sitzung verwalten, die über die Funktionsweise von HTTP selbst sprechen: Cookies, Header usw. Die Transportadapter verwalten Dinge, die mit der Funktionsweise von Netzwerkverbindungen zusammenhängen: Sockets, Timeouts usw.

Zur Verdeutlichung lautet Ihre Empfehlung, dass die Leute dies tun?

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 das ist eine Option. Jawohl

Aber ist es genauer gesagt die _Empfehlung_?

Es gibt keine spezifische Empfehlung, da die Bedürfnisse der Benutzer variieren und es eine Vielzahl von Möglichkeiten gibt, dies für diese Benutzer zu berücksichtigen.

@staticshock @sigmavirus24

Diese Lösung erscheint zu kompliziert. Folgendes scheint bei mir zu funktionieren.

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

Diese Lösung erscheint zu kompliziert. Folgendes scheint bei mir zu funktionieren.

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

Beachten Sie, dass Sie dies auch auf die anderen Verben anwenden müssen, zB post , put usw., wenn Sie diese verwenden. Der Vollständigkeit halber verwende ich folgendes:

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

Warum nicht einfach die Methode request ?

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

Wenn Sie es global auf Modulebene benötigen und keine Sitzungen verwenden, können Sie möglicherweise Folgendes tun:

requests.api.request = functools.partial(requests.api.request, timeout=3)

Ich bin mir nicht sicher, wie dies mit der Verwendung in mehreren Modulen zusammenhängt. Ich könnte mir vorstellen, dass Sie das Shim in jeder Datei benötigen, in der Sie Anforderungen verwenden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen