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