python post content-type:multipart/form-data 类型的表单数据
2016-01-10 11:21
2071 查看
表单数据post默认为application/x-www-form-urlencode,可以为<form>标签加入属性enctype=multipart/form-data,使得post的数据按multipart/form-data编码,这种格式通常用于文件上传,二进制传输,但是普通表单数据也可以使用multipart/form-data。
python处理multipart/form-data的其中一个模块是poster,大体使用方法如下:
导入模块中的相关函数
再为headers添加更多的键值对信息,生成请求对象
python处理multipart/form-data的其中一个模块是poster,大体使用方法如下:
导入模块中的相关函数
from poster.encode import multipart_encode,MultipartParam from poster.streaminghttp import register_openers首先,用register_openers()把http流处理器绑定到urllib2上
opener = poster.streaminghttp.register_openers()这里注意,之前用
#绑定cookie,自动处理cookie cj = cookielib.LWPCookieJar() #生成一个带cookie的opener,可以使用opener.open()打开URL opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #安装opener,使得可以直接用urllib2.urlopen()带上cookie urllib2.install_opener(opener)生成了带有cookie的urllib2,register_openers()会把urllib2刷新,所以需要重新绑定cookie的处理器(我自己的理解,不对的地方,请指正)
opener.add_handler(urllib2.HTTPCookieProcessor(cj))对于不带文件上传的纯表单数据,把name和value组成一个dict,比如params,接下来用
datagen, headers = multipart_encode(params)datagen是一个生成器,headers是请求头,现在携带了content-length和content-type,content-type包含类型multipart/form-data和随机生成boundary用于分割post的数据块。
再为headers添加更多的键值对信息,生成请求对象
req = urllib2.Request(url, datagen, headers)使用请求对象访问
urllib2.urlopen(req)对于上传文件的情况,我是这样做的
datagen,headers = multipart_encode({'file':open(path,'rb')})其中name为file对应到实际的情况。如果又要普通表单参数又有文件的情况,我认为也可以直接组装成一个dict,然后使用multipart_encode,然后stackoverflow上面的方式是这样的
from poster.encode import multipart_encode, MultipartParam import urllib2 def postFileRequest(url, paramName, fileObj, additionalHeaders={}, additionalParams={}): items = [] #wrap post parameters for name, value in additionalParams.items(): items.append(MultipartParam(name, value)) #add file items.append(MultipartParam.from_file(paramName, fileObj)) datagen, headers = multipart_encode(items) #add headers for item, value in additionalHeaders.iteritems(): headers[item] = value return urllib2.Request(url, datagen, headers)把其他参数封装成MultipartParam类,文件用Multipart.from_file()添加,然后再进行encode。没有测试过,参考http://stackoverflow.com/questions/10546437/problems-using-multipart-encode-poster-library。另外还可以参考官方文档http://atlee.ca/software/poster/poster.encode.html#poster.encode.MultipartParam。
相关文章推荐
- Python之import流程
- Python 虚拟环境Virtualenv
- Python 虚拟环境Virtualenv
- 通过python模块实现服务器和本地机器之间快速拷贝文件
- 详解Python发送邮件实例
- python文件读写
- python轻松查到删除自己的微信好友
- python的reduce函数和map函数
- 解读Python发送邮件
- python3数组使用说明
- Python 爬虫学习稿(一)
- 关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()
- python2.7---查询信息代码
- python轻松查到删除自己的微信好友
- 详解Python发送邮件实例
- Python 虚拟环境Virtualenv
- python之路-模块 WebDriver API
- python routes
- python学习之简单正则与爬虫
- Python pip 更新问题汇总