2012-04-11 19 views
24

Zastanawiałem się, w jaki sposób można zamknąć połączenie z żądaniami (python-requests.org)?Python-Requests zamknij połączenie http

Z httplib to HTTPConnection.close(), ale jak zrobić to samo z Żądaniami?

Kod jest poniżej:

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

góry dzięki.

+0

Nie sądzę, że prośby ustanawiają trwałe połączenie ... nie ma połączenia z zamknięciem. –

+0

@ Michael, dostajesz stałą pulę połączeń za darmo, chyba że określisz inaczej http://docs.python-requests.org/en/latest/user/advanced/#keep-alive – istruble

+0

@istruble Następnie urllib3 obsługuje czyszczenie połączenia basen? –

Odpowiedz

14

Tak jak omówiono here, tak naprawdę nie ma czegoś takiego jak połączenie HTTP i to, co oznacza httplib, ponieważ połączenie HTTPConnection jest tak naprawdę podstawowym połączeniem TCP, które tak naprawdę nie wie wiele o twoich żądaniach. Żąda abstrakty, które odejdą, a ty nigdy go nie zobaczysz.

Najnowsza wersja Żądań faktycznie utrzymuje połączenie TCP przy życiu po żądaniu. Jeśli chcesz, aby twoje połączenia TCP zostały zamknięte, możesz po prostu skonfigurować żądania, aby nie używać keep-alive.

s = requests.session() 
s.config['keep_alive'] = False 
+11

Alternatywnie 's = requests.session (config = {'keep_alive': False})' –

+4

OP pytał, jak zamknąć odpowiedź strumieniową. Nie rozumiem, w jaki sposób pomoże to ustawienie podtrzymujące sesję. W tym numerze jest kilka ostatnich zgłoszeń dotyczących zgłoszeń i urllib3: https://github.com/shazow/urllib3/pull/132, https://github.com/kennethreitz/requests/issues/1073, https: // github .com/kennethreitz/requests/issues/1041 – btubbs

+0

Zobacz komentarz tutaj: https://github.com/shazow/urllib3/pull/132#issuecomment-11516729 –

39

myślę bardziej niezawodny sposób zamykania połączenia jest powiedzieć sever jawnie zamknąć go w sposób compliant with HTTP specification:

HTTP/1.1 definiuje „Zamknij” opcję połączenia dla nadawcy na sygnalizuje, że połączenie zostanie zamknięte po zakończeniu odpowiedzi . Na przykład,

Connection: close 

w każdym wniosku lub polach nagłówka odpowiedzi wskazuje, że połączenie nie powinny być uważane za `trwałe” (sekcja 8.1) po obecny żądanie/odpowiedź jest kompletna.

Nagłówek Connection: close dodaje do rzeczywistej życzenie:

r = requests.post(url=url, data=body, headers={'Connection':'close'}) 
+0

Tak to wydaje się działać. Miałem ten sam problem co OP. – DjangoRocks

+0

To zadziałało dla mnie. – philshem

+0

Co to jest "ciało" w tym przypadku? po prostu {}? – Brad

8

sprawie wniosków 1.X, połączenie jest dostępny na obiekcie odpowiedzi:

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

r.connection.close() 
0

proszę wykorzystać response.close() aby zamknąć aby uniknąć błędu "zbyt wiele otwartych plików"

na przykład:

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

Przyszedłem do tego pytania, aby rozwiązać "too many open files" error, ale używam requests.session() w moim kodzie. Kilka wyszukiwania później wpadłem na odpowiedź na Python Requests Documentation co sugeruje użycie bloku with tak, że sesja jest zamknięta, nawet jeśli nie są nieobsłużone wyjątki:

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

Jeśli nie używasz sesji co możliwe właściwie robię to samo: http://docs.python-requests.org/en/master/api/#requests.Response.close

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