我想知道,你如何关闭与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))
提前致谢。
答案 0 :(得分:49)
我认为关闭连接的一种更可靠的方法是明确告诉服务器以compliant with HTTP specification的方式关闭它:
HTTP / 1.1为发件人定义“关闭”连接选项 表示连接完成后将关闭 响应。例如,
Connection: close
在请求或响应头字段中指示 连接不应被视为“持久性”(第8.1节)之后 当前的请求/响应已完成。
Connection: close
标头已添加到实际请求中:
r = requests.post(url=url, data=body, headers={'Connection':'close'})
答案 1 :(得分:19)
正如所讨论的here,确实没有HTTP连接和httplib所指的东西,因为HTTPConnection实际上是底层的TCP连接,它根本不了解你的请求。请求抽象出来,你永远不会看到它。
最新版本的Requests确实会在您的请求之后保持TCP连接的活动状态。如果您确实希望关闭TCP连接,则可以将请求配置为不使用keep-alive。
s = requests.session()
s.config['keep_alive'] = False
答案 2 :(得分:10)
在请求1.X上,连接在响应对象上可用:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json",
data={'track': toTrack}, auth=('username', 'passwd'))
r.connection.close()
答案 3 :(得分:7)
我来到这个问题寻求解决"too many open files" error
,但我在我的代码中使用requests.session()
。稍后进行一些搜索,我在Python Requests Documentation上找到答案,建议使用with
块,以便即使存在未处理的异常,会话也会关闭:
with requests.Session() as s:
s.get('http://google.com')
如果你没有使用Session,你实际上可以做同样的事情:http://docs.python-requests.org/en/master/api/#requests.Response.close
with requests.get('http://httpbin.org/get', stream=True) as r:
# Do something
答案 4 :(得分:5)
请使用response.close()
关闭以避免“打开太多文件”错误
例如:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()
答案 5 :(得分:0)
这对我有用:
res = requests.get(<url>, timeout=10).content
requests.session().close()
答案 6 :(得分:0)
要删除请求中的“保持活动”标头,我只是从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)
答案 7 :(得分:0)
根据最新的请求(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)