Python-请求关闭http连接
- 2025-03-20 08:47:00
- admin 原创
- 41
问题描述:
我想知道,如何关闭与 Requests(python-requests.org)的连接?
有了httplib
它HTTPConnection.close()
,但是我如何对请求执行相同的操作?
代码:
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))
解决方案 1:
我认为关闭连接的更可靠方法是以符合 HTTP 规范的方式明确告诉服务器关闭它:
HTTP/1.1 定义了“close”连接选项,让发送方发出信号,表示响应完成后将关闭连接。例如,
Connection: close
在请求或响应标头字段中,表示在当前请求/响应完成后,该连接不应被视为“持久的”(第 8.1 节)。
标Connection: close
头添加到实际请求中:
r = requests.post(url=url, data=body, headers={'Connection':'close'})
解决方案 2:
我来这个问题是为了解决"too many open files" error
,但我在代码中使用。经过几次搜索后,我在Python 请求文档requests.session()
中找到了一个答案,它建议使用块,以便即使存在未处理的异常也可以关闭会话:with
with requests.Session() as s:
s.get('http://google.com')
如果您不使用 Session,您实际上可以做同样的事情:https://2.python-requests.org/en/master/user/advanced/#session-objects
with requests.get('http://httpbin.org/get', stream=True) as r:
# Do something
解决方案 3:
正如这里所讨论的,实际上并不存在 HTTP 连接,httplib 所指的 HTTPConnection 实际上是底层 TCP 连接,它实际上根本不了解您的请求。Requests 将其抽象化,您永远不会看到它。
最新版本的 Requests 确实会在您发出请求后保持 TCP 连接处于活动状态。如果您确实希望关闭 TCP 连接,您只需将请求配置为不使用keep-alive即可。
s = requests.session()
s.config['keep_alive'] = False
解决方案 4:
请使用response.close()
关闭以避免“打开太多文件”错误
例如:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()
解决方案 5:
在请求 1.X 中,连接在响应对象上可用:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json",
data={'track': toTrack}, auth=('username', 'passwd'))
r.connection.close()
解决方案 6:
根据最新的请求(2.25.1),requests.<method>
将默认关闭连接
with sessions.Session() as session:
return session.request(method=method, url=url, **kwargs)
https://github.com/psf/requests/blob/master/requests/api.py#L60
因此,如果使用最新版本的请求,似乎我们不需要自己关闭连接。
此外,如果您需要使用同一个会话发送多次请求,最好使用requests.Session()
而不是多次打开/关闭连接。例如:
with requests.Session() as s:
r = s.get('https://example.org/1/')
print(r.text)
r = s.get('https://example.org/2/')
print(r.text)
r = s.get('https://example.org/3/')
print(r.text)
解决方案 7:
这对我有用:
res = requests.get(<url>, timeout=10).content
requests.session().close()
解决方案 8:
为了删除请求中的“keep-alive”标头,我只需从 Request 对象创建它,然后使用 Session 发送它
headers = {
'Host' : '1.2.3.4',
'User-Agent' : 'Test client (x86_64-pc-linux-gnu 7.16.3)',
'Accept' : '*/*',
'Accept-Encoding' : 'deflate, gzip',
'Accept-Language' : 'it_IT'
}
url = "https://stream.twitter.com/1/statuses/filter.json"
#r = requests.get(url, headers = headers) #this triggers keep-alive: True
s = requests.Session()
r = requests.Request('GET', url, headers)
扫码咨询,免费领取项目管理大礼包!