2012-04-11 70 views
24

Me preguntaba, ¿cómo cerrar una conexión con las solicitudes (python-requests.org)?Python-Requests cerrar la conexión HTTP

Con httplib es HTTPConnection.close(), pero ¿cómo hago lo mismo con las solicitudes?

Código es el siguiente:

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

Gracias de antemano.

+0

no creo solicitudes establece una conexión persistente ... que no hay conexión a cerrar. –

+0

@michael, obtienes un grupo de conexión persistente de forma gratuita a menos que especifiques lo contrario http://docs.python-requests.org/en/latest/user/advanced/#keep-alive – istruble

+0

@istruble Luego, urllib3 maneja la limpieza de la conexión ¿piscina? –

Respuesta

14

, como en el caso here, realmente no existe una conexión HTTP y lo que httplib llama HTTPConnection es realmente la conexión TCP subyacente que realmente no sabe mucho sobre sus solicitudes. Pide resúmenes que desaparezcan y nunca lo verás.

La última versión de Requests mantiene activa la conexión TCP después de su solicitud. Si desea que se cierren sus conexiones TCP, puede configurar las solicitudes para no usar keep-alive.

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

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

+4

OP preguntaba cómo cerrar una respuesta de transmisión. No veo cómo la configuración Keep-Live en la sesión va a ayudar allí. Hay varias entradas recientes en las solicitudes y urllib3 sobre este tema: https://github.com/shazow/urllib3/pull/132, https://github.com/kennethreitz/requests/issues/1073, https: // github .com/kennethreitz/requests/issues/1041 – btubbs

+0

Ver comentario aquí: https://github.com/shazow/urllib3/pull/132#issuecomment-11516729 –

39

creo que de una manera más fiable de cerrar una conexión es decirle al cortar de forma explícita para cerrarla de manera compliant with HTTP specification:

HTTP/1.1 define el "cierre" opción de conexión para el remitente a señal de que la conexión se cerrará después de completar la respuesta . Por ejemplo,

Connection: close 

en la solicitud o de los campos de cabecera de respuesta indica que la conexión no deben considerarse `persistente'(sección 8.1) después de la solicitud actual/respuesta es completa.

La cabecera Connection: close se añade a la solicitud real:

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

Sí esto parece funcionar Tuve el mismo problema que OP. – DjangoRocks

+0

Esto funcionó para mí. – philshem

+0

¿Qué es 'cuerpo' en este caso? solo cualquiera {}? – Brad

8

en las solicitudes 1.x, la conexión está disponible en el objeto respuesta:

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

r.connection.close() 
0

favor utilice response.close() para cerrar para evitar el error "demasiados archivos abiertos"

por ejemplo:

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

Vine a esta pregunta en busca de resolver el "too many open files" error, pero yo estoy usando requests.session() en mi código. Unas búsquedas más tarde y se le ocurrió una respuesta en la Python Requests Documentation que sugiere utilizar el bloque with de manera que se cierra la sesión, aunque hay excepciones no controladas:

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

Si usted no está utilizando sesión Puede realmente hacer la misma cosa: http://docs.python-requests.org/en/master/api/#requests.Response.close

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