我在Python(2.7)中寻找一种方法来处理具有3个需求的HTTP请求:
我已经检查了相当多的python HTTP libraries,但是没有一个符合我的要求。例如:
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文件,也无法使用“read”方法…
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()
您可以使用} call 支持的额外参数,该参数允许您指定要读取解码的数据:
requests
来完成这项工作,但是您需要知道raw
对象是urllib3
内脏的一部分,并使用^{或者,可以在读取之前设置
raw
对象上的decode_content
标志:如果您不喜欢像这样触及} 来迭代块中的解码内容;这也使用底层的} generator version :
urllib3
的内脏,可以使用^{HTTPResponse
(使用^{这里处理压缩数据大小的方式有细微的差别;
r.raw.read(100000+1)
将只读取100k字节的压缩数据;未压缩数据将根据您的最大大小进行测试。iter_content()
方法将读取更多未压缩数据在极少情况下,压缩流比未压缩数据大。两种方法都不允许
r.json()
工作;这些方法不设置response._content
属性;当然,您可以手动设置。但是由于.raw.read()
和.iter_content()
调用已经允许您访问所讨论的内容,因此实际上没有必要。相关问题 更多 >
编程相关推荐