HTTP-Anfrage mit Timeout, maximaler Größe und Verbindungspooling

8

Ich suche nach einer Möglichkeit in Python (2.7), HTTP-Anfragen mit drei Anforderungen auszuführen:

  • Timeout (für Zuverlässigkeit)
  • maximale Größe des Inhalts (für Sicherheit)
  • Verbindungspooling (für die Leistung)

Ich habe ziemlich alle Python-HTTP-Libraries überprüft, aber keine von ihnen erfüllt meine Anforderungen. Zum Beispiel:

urllib2: gut, aber kein Pooling

%Vor%

Anfragen: keine maximale Größe

%Vor%

urllib3: Die "read" -Methode hat nie funktioniert, auch nicht mit einer 50Mo-Datei ...

Ссылка

Ich kann kaum glauben, dass urllib2 die beste HTTP-Bibliothek ist, die ich verwenden kann! Also, wenn jemand weiß, was librairy kann dies tun oder wie eine der vorherigen librairy verwenden ...

BEARBEITEN:

Die beste Lösung, die ich dank Martijn Pieters gefunden habe (StringIO verlangsamt selbst bei großen Dateien nicht, wo str adition viel tut).

%Vor%     
Aurélien Lambert 07.05.2014, 09:44
quelle

1 Antwort

12

Sie können es mit requests einfach machen; aber Sie müssen wissen, dass das raw -Objekt ein Teil der urllib3 -Drähte ist und die zusätzlichen Argumente verwendet, die HTTPResponse.read() Aufruf unterstützt, mit dem Sie angeben können, dass Sie dekodierte Daten lesen möchten:

%Vor%

Alternativ können Sie das decode_content -Flag am Objekt raw vor dem Lesen setzen:

%Vor%

Wenn Sie nicht in urllib3 guts so hineingreifen möchten, verwenden Sie die response.iter_content() , um den dekodierten Inhalt in Chunks zu durchlaufen; Dies verwendet auch das zugrunde liegende HTTPResponse (mit dem .stream() Generatorversion :

%Vor%

Hier gibt es einen feinen Unterschied darin, wie komprimierte Datengrößen hier gehandhabt werden; r.raw.read(100000+1) liest immer nur 100 kB komprimierte Daten; Die unkomprimierten Daten werden anhand Ihrer maximalen Größe getestet. Die Methode iter_content() liest mehr unkomprimierte Daten , wenn der komprimierte Datenstrom größer als die unkomprimierten Daten ist.

Keine der Methoden erlaubt r.json() zu arbeiten; Das response._content -Attribut wird von diesen nicht festgelegt. Sie können dies natürlich manuell tun. Aber da die Aufrufe .raw.read() und .iter_content() bereits Zugriff auf den fraglichen Inhalt gewähren, ist dies wirklich nicht nötig.

    
Martijn Pieters 07.05.2014, 10:00
quelle