Python-Anfragen, wie die empfangene Größe, Übertragungsrate und / oder Gesamtzeit zu begrenzen?

8

Mein Server führt externe Anfragen aus und ich möchte den Schaden begrenzen, den eine fehlgeschlagene Anfrage verursachen kann. Ich möchte die Anfrage in folgenden Situationen abbrechen:

  • Die Gesamtzeit der Anfrage liegt über einem bestimmten Limit (selbst wenn Daten noch ankommen)
  • Die insgesamt empfangene Größe überschreitet ein Limit (Ich muss vor der Annahme weiterer Daten abbrechen)
  • die Übertragungsgeschwindigkeit fällt unter ein bestimmtes Niveau (obwohl ich ohne dieses leben kann, wenn ein Gesamtzeitlimit zur Verfügung gestellt werden kann)

Hinweis Ich suche nicht nach dem timeout -Parameter in Anfragen, da dies nur ein Zeitlimit für Inaktivität ist. Ich kann nichts mit einem totalen Timeout oder einer Möglichkeit zur Begrenzung der Gesamtgröße zu tun haben. Ein Beispiel zeigt einen maxsize -Parameter auf HTTPAdapter , aber das ist nicht dokumentiert.

Wie erreiche ich diese Anforderungen mit requests ?

    
edA-qa mort-ora-y 12.03.2014, 08:45
quelle

1 Antwort

10

Sie könnten versuchen, stream=True einzustellen und dann eine Anfrage abzubrechen, wenn Ihre Zeit- oder Größenbeschränkungen überschritten werden, während Sie die Daten in Blöcken lesen.

Ab requests release 2.3.0 gilt die Zeitüberschreitung auch für Streaming-Anfragen. Sie müssen also nur eine Zeitüberschreitung für die erste Verbindung und jeden Iterationsschritt berücksichtigen:

%Vor%

Passen Sie das Zeitlimit nach Bedarf an.

Für requests releases & lt; 2.3.0 (die diese Änderung enthielt), konnte die r.iter_content() rendite nicht überschritten werden; Ein Server, der nicht mehr in der Mitte eines Chunks antwortet, würde die Verbindung trotzdem herstellen. Sie müssten den obigen Code in eine zusätzliche Timeout-Funktion einfügen um lang andauernde Reaktionen frühzeitig zu unterbinden.

    
Martijn Pieters 12.03.2014, 09:46
quelle

Tags und Links