如何使用python海报库通过HTTP和Cookie发布文件
使用ChrisAtlee的python,有没有办法包含cookie处理? 我有python http登录代码,可用于cookie:如何使用python海报库通过HTTP和Cookie发布文件,python,http,cookies,file-upload,Python,Http,Cookies,File Upload,使用ChrisAtlee的python,有没有办法包含cookie处理? 我有python http登录代码,可用于cookie: cookiejar = cookielib.CookieJar() urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar)) request = urllib2.Request(login_url, params) result = urlOpener.open(request)
cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
request = urllib2.Request(login_url, params)
result = urlOpener.open(request)
但当我需要上传文件时,我不知道如何使用海报库代码和cookie处理代码。海报库似乎需要调用urllib2.urlopen(),而不是像上面代码中那样的自定义url开启器
例如,我不知道如何将cookie与下面的python文件post代码一起使用:
register_openers()
params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urllib2.urlopen(request)
你试过这个吗:
cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
register_openers()
params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urlOpener.open(request)
我已经知道怎么做了。我不确定这是否是处理事情的最佳方式,但它是有效的,所以我将分享它。为了将海报库与cookies一起使用,必须将
urllib2.HTTPCookieProcessor
添加到内置的开瓶器poster.streaminghttp.register\u openers()
基本上,修改poster.streaminghttp.register_openers()使其看起来像下面的代码,如果您想进行cookie处理,请传入一个cookiejar
对象
def register_openers(cookiejar=None):
"""Register the streaming http handlers in the global urllib2 default
opener object.
Returns the created OpenerDirector object."""
handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler]
if hasattr(httplib, "HTTPS"):
handlers.append(StreamingHTTPSHandler)
if cookiejar:
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar), *handlers)
else:
opener = urllib2.build_opener(*handlers)
urllib2.install_opener(opener)
return opener
示例用法:
# Logging in
import urllib, urllib2, cookielib
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
cookiejar = cookielib.CookieJar()
loginOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
params = urllib.urlencode({'username':'admin', 'password':'default'})
login_url = "http://127.0.0.1:8000/account/login/"
request = urllib2.Request(login_url, params)
login = loginOpener.open(request)
# Upload File
# use the login cookie for file upload
register_openers(cookiejar=cookiejar)
params = {'entity_file': open("test.txt", "rb"),'name': 'test', 'action':'upload'}
upload_url = "http://127.0.0.1:8000/upload/"
datagen, headers = multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urllib2.urlopen(request)
您不必修改原始源代码,只需手动安装所有必需的openers(无需调用register_openers()):
我给Chris Atley发了一封电子邮件,询问我们是否可以得到一个基本的身份验证示例。他对回答我的问题非常冷静,甚至运行了我发给他的一些示例代码 要包括cookie处理,您可以执行以下操作:
opener = poster.streaminghttp.register_openers()
opener.add_handler(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) # Add cookie handler
params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = poster.encode.multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urllib2.urlopen(request)
要向请求添加基本身份验证,只需执行以下操作(为了完整性,我添加了base64编码行):
希望这有帮助。还要感谢克里斯·阿特利。我已经试过了。使用在中找到的python脚本,无法上载。脚本错误,我从脚本中得到一些回溯(),以及来自django开发服务器的这些回溯:。我可能把事情安排错了,但我认为你的建议不正确。感谢您的帮助不要忘记关闭
test.txt
文件?
opener = poster.streaminghttp.register_openers()
opener.add_handler(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) # Add cookie handler
params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = poster.encode.multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urllib2.urlopen(request)
opener = poster.streaminghttp.register_openers()
params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = poster.encode.multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
auth = base64.encodestring('%s:%s' % ('username', 'password'))[:-1] # This is just standard un/pw encoding
request.add_header('Authorization', 'Basic %s' % auth ) # Add Auth header to request
result = urllib2.urlopen(request)