我正在寻找一种在 Python (2.7) 中执行具有 3 个要求的 HTTP 请求的方法:
- 超时(为了可靠性)
- 内容最大大小(出于安全考虑)
- 连接池(用于性能)
我已经检查了几乎所有的 python HTTP 库,但没有一个符合我的要求。例如:
urllib2:很好,但没有池化
import urllib2
import json
r = urllib2.urlopen('https://github.com/timeline.json', timeout=5)
content = r.read(100+1)
if len(content) > 100:
print 'too large'
r.close()
else:
print json.loads(content)
r = urllib2.urlopen('https://github.com/timeline.json', timeout=5)
content = r.read(100000+1)
if len(content) > 100000:
print 'too large'
r.close()
else:
print json.loads(content)
请求:没有最大尺寸
import requests
r = requests.get('https://github.com/timeline.json', timeout=5, stream=True)
r.headers['content-length'] # does not exists for this request, and not safe
content = r.raw.read(100000+1)
print content # ARF this is gzipped, so not the real size
print json.loads(content) # content is gzipped so pretty useless
print r.json() # Does not work anymore since raw.read was used
urllib3:从来没有让“读取”方法工作,即使是 50Mo 文件......
httplib:httplib.HTTPConnection 不是池(只有一个连接)
我简直不敢相信 urllib2 是我可以使用的最好的 HTTP 库!因此,如果有人知道什么库可以做到这一点或如何使用以前的库之一...
编辑:
多亏了 Martijn Pieters,我找到了最好的解决方案(即使对于大文件,StringIO 也不会减慢速度,其中 str 加法会做很多事情)。
r = requests.get('https://github.com/timeline.json', stream=True)
size = 0
ctt = StringIO()
for chunk in r.iter_content(2048):
size += len(chunk)
ctt.write(chunk)
if size > maxsize:
r.close()
raise ValueError('Response too large')
content = ctt.getvalue()