Python-Requests关闭http连接

时间:2012-04-11 22:54:13

标签: python http urllib2 httplib python-requests

我想知道,你如何关闭与Requests(python-requests.org)的连接?

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

提前致谢。

8 个答案:

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