it-swarm.com.de

Python-Requests schließen die HTTP-Verbindung

Ich habe mich gefragt, wie schließen Sie eine Verbindung mit Requests (python-requests.org)? 

Mit httplib ist es HTTPConnection.close(), aber wie mache ich dasselbe mit Requests? 

Code ist unten:

    r = requests.post("https://stream.Twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))

    for line in r.iter_lines():
        if line:
            self.mongo['db'].tweets.insert(json.loads(line))

Danke im Voraus.

30
user179169

Wie bereits erwähnt - hier , gibt es eigentlich keine HTTP-Verbindung, und was httplib als HTTPConnection bezeichnet, ist wirklich die zugrunde liegende TCP -Verbindung, die nicht wirklich viel über Ihre Anfragen weiß . Fordert Abstracts an, die weg sind und Sie werden es nie sehen.

Die neueste Version von Requests hält tatsächlich die TCP - Verbindung nach Ihrer Anfrage am Leben. Wenn Ihre TCP - Verbindungen geschlossen werden sollen, können Sie die Anforderungen so konfigurieren, dass keep-alive nicht verwendet wird .

s = requests.session()
s.config['keep_alive'] = False
18
Felix Fung

Ein zuverlässigerer Weg, eine Verbindung zu schließen, besteht darin, dem Server explizit mitzuteilen, dass er die Verbindung auf eine Art entsprechend der HTTP-Spezifikation :

HTTP/1.1 definiert die Verbindungsoption "Schließen" für den Absender an signalisieren, dass die Verbindung nach Abschluss von .__ geschlossen wird. Antwort. Zum Beispiel,

   Connection: close

in den Feldern für die Anforderung oder für die Antwort gibt an, dass die Verbindung sollte nicht als "persistent" (Abschnitt 8.1) nach .__ angesehen werden. Die aktuelle Anfrage/Antwort ist abgeschlossen.

Der Connection: close-Header wird der aktuellen Anforderung hinzugefügt:

r = requests.post(url=url, data=body, headers={'Connection':'close'})
49
Oleg Gryb

Bei Requests 1.X ist die Verbindung für das Antwortobjekt verfügbar:

r = requests.post("https://stream.Twitter.com/1/statuses/filter.json",
                  data={'track': toTrack}, auth=('username', 'passwd'))

r.connection.close()
9
Wilfred Hughes

Ich kam zu dieser Frage, um den "too many open files" error zu lösen, benutze aber requests.session() in meinem Code. Ein paar Suchvorgänge später fand ich eine Antwort auf die Python Requests-Dokumentation , die vorschlägt, den with-Block zu verwenden, damit die Sitzung geschlossen wird, auch wenn nicht behandelte Ausnahmen vorliegen:

with requests.Session() as s:
    s.get('http://google.com')

Wenn Sie Session nicht verwenden, können Sie tatsächlich dasselbe tun: http://docs.python-requests.org/de/master/api/#requests.Response.close

with requests.get('http://httpbin.org/get', stream=True) as r:
    # Do something
6
stwhite

bitte verwenden Sie response.close() zum Schließen, um den Fehler "zu viele offene Dateien" zu vermeiden

zum Beispiel:

r = requests.post("https://stream.Twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()
4
hatcher

das funktioniert für mich:

res = requests.get(<url>, timeout=10).content
requests.session().close()
0
user1990614