requests libreria library from example python http urllib2 httplib python-requests

libreria - python requests response



Solicitudes de Python cerrar conexión http (6)

Al solicitar 1.X, la conexión está disponible en el objeto de respuesta:

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

Me preguntaba, ¿cómo cerrar una conexión con Solicitudes (python-requests.org)?

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

El código está abajo:

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 por adelantado.


Como se discutió here , realmente no existe una conexión HTTP y lo que httplib denomina HTTPConnection es realmente la conexión TCP subyacente que realmente no sabe mucho acerca de sus solicitudes. Solicita resúmenes que no los veas nunca.

De hecho, la versión más reciente de Solicitudes mantiene la conexión TCP activa después de su solicitud. Si desea que sus conexiones TCP se cierren, puede configurar las solicitudes para que no usen docs.python-requests.org/en/latest/user/advanced/#keep-alive .

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


Creo que una forma más confiable de cerrar una conexión es decirle al servidor explícitamente que la cierre de una manera compatible con la especificación HTTP :

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

Connection: close

en los campos del encabezado de la solicitud o de la respuesta, indica que la conexión NO DEBE considerarse "persistente" (sección 8.1) después de completar la solicitud / respuesta actual.

La Connection: close encabezado de Connection: close se agrega a la solicitud real:

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


Llegué a esta pregunta para resolver el "too many open files" error , pero estoy usando requests.session() en mi código. Unas pocas búsquedas más tarde y encontré una respuesta en la documentación de Python Requests que sugiere usar el bloque with para que la sesión se cierre incluso si hay excepciones no controladas:

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

Si no está utilizando Session, puede hacer lo mismo: http://docs.python-requests.org/en/master/api/#requests.Response.close

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


esto funciona para mi

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


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