web-dev-qa-db-fra.com

Python-Requests ferme la connexion http

Je me demandais comment fermer une connexion avec Requests (python-requests.org)? 

Avec httplib c'est HTTPConnection.close(), mais comment puis-je faire la même chose avec Requests? 

Le code est ci-dessous:

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

Merci d'avance.

30
user179169

Comme discuté ici , il n’existe pas vraiment de connexion HTTP et ce que httplib désigne par HTTPConnection est en réalité la connexion sous-jacente TCP qui ne connaît pas grand-chose à vos demandes. . Demande des résumés que loin et vous ne le verrez jamais.

En fait, la version la plus récente de Requests maintient la connexion TCP après votre demande. Si vous souhaitez que vos connexions TCP soient fermées, vous pouvez simplement configurer les demandes de manière à ne pas utiliser keep-alive .

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

Je pense qu'un moyen plus fiable de fermer une connexion est de dire explicitement au serveur de la fermer d'une manière conforme à la spécification HTTP :

HTTP/1.1 définit l'option de connexion "close" pour l'expéditeur à signaler que la connexion sera fermée après l'achèvement du réponse. Par exemple,

   Connection: close

dans les champs d’en-tête de requête ou de réponse indique que le la connexion NE DEVRAIT PAS être considérée comme "persistante" (section 8.1) après la demande/réponse en cours est terminée.

L'en-tête Connection: close est ajouté à la demande réelle:

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

Sur Requests 1.X, la connexion est disponible sur l'objet de réponse:

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

r.connection.close()
9
Wilfred Hughes

Je suis venu à cette question cherchant à résoudre le "too many open files" error, mais j'utilise requests.session() dans mon code. Quelques recherches plus tard, j'ai trouvé une réponse dans Python Requests Documentation qui suggère d'utiliser le bloc with pour que la session soit fermée même s'il existe des exceptions non gérées:

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

Si vous n'utilisez pas Session, vous pouvez réellement faire la même chose: http://docs.python-requests.org/en/master/api/#requests.Response.close

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

veuillez utiliser response.close() pour fermer afin d'éviter l'erreur "trop ​​de fichiers ouverts"

par exemple:

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

cela fonctionne pour moi:

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