Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python海报库通过HTTP和Cookie发布文件_Python_Http_Cookies_File Upload - Fatal编程技术网

如何使用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)

使用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)
但当我需要上传文件时,我不知道如何使用海报库代码和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)