是否可以使用httplib2以块的形式下载大文件。我正在从Google API下载文件,为了使用Google OAuth2WebServerFlow中的凭据,我必然会使用httplib2。
我正在做的那一刻:
flow = OAuth2WebServerFlow(
client_id=XXXX,
client_secret=XXXX,
scope=XYZ,
redirect_uri=XYZ
)
credentials = flow.step2_exchange(oauth_code)
http = httplib2.Http()
http = credentials.authorize(http)
resp, content = self.http.request(url, "GET")
with open(file_name, 'wb') as fw:
fw.write(content)
但是content
变量可以超过500MB。
以块的形式阅读响应的任何方式?
答案 0 :(得分:0)
您可以考虑streaming_httplib2,httplib2的一个分支,其行为完全正确。
为了使用Google OAuth2WebServerFlow中的凭据,我必然会使用httplib2。
如果您需要httplib2中没有的功能,那么值得查看让您的凭据处理与另一个HTTP库一起工作的工作量。这可能是一项很好的长期投资。 (例如How to download large file in python with requests.py?。)
答案 1 :(得分:0)
关于以块的形式阅读响应(与httplib一起使用,必须与httplib2一起使用)
import httplib
conn = httplib.HTTPConnection("google.com")
conn.request("GET", "/")
r1 = conn.getresponse()
try:
print r1.fp.next()
print r1.fp.next()
except:
print "Exception handled!"
注意:next()
可能会引发StopIteration
异常,您需要处理它。
您可以避免像这样调用next()
F=open("file.html","w")
for n in r1.fp:
F.write(n)
F.flush()
答案 2 :(得分:0)
您可以将oauth2client.client.Credentials应用于urllib2请求。
首先,获取credentials
对象。在您的情况下,您正在使用:
credentials = flow.step2_exchange(oauth_code)
现在,使用该对象获取auth标头并将其添加到urllib2请求中:
req = urllib2.Request(url)
auth_headers = {}
credentials.apply(auth_headers)
for k,v in auth_headers.iteritems():
req.add_header(k,v)
resp = urllib2.urlopen(req)
现在resp
是一个类似文件的对象,可用于读取URL的内容