python接口自动化18-requests-toolbelt处理multipart/form-data

一、requests-toolbelt 1.官方文档地址:[requests-toolbelt官方文档](https://pypi.python.org/pypi/requests-toolbelt/) 2.环境安装 > pip install requests-toolbelt

二、multipart/form-data传文件 ``` from requests_toolbelt import MultipartEncoder import requests m = MultipartEncoder( fields={'field0': 'value', 'field1': 'value', 'field2': ('filename', open('file.py', 'rb'), 'text/plain')} ) r = requests.post('http://httpbin.org/post', data=m, headers={'Content-Type': m.content_type}) ``` 三、multipart/form-data表单提交(传非文件) ``` from requests_toolbelt import MultipartEncoder import requests m = MultipartEncoder( fields={'field0': 'value', 'field1': 'value'}) r = requests.post('http://httpbin.org/post', data=m, headers={'Content-Type': m.content_type}) ``` 四、多个文件参数重复 1.参数重复的时候,就不用字典了,用list类型 ``` from requests_toolbelt import MultipartEncoder import requests m = MultipartEncoder( fields = [ ('source', ('f1.ext', f1, 'application/x-example-mimetype'), ('source', ('f2.ext', f2, 'application/x-example-mimetype'), ] ) r = requests.post('http://httpbin.org/post', data=m, headers={'Content-Type': m.content_type}) ``` # 参考代码: ``` # coding:utf-8 import requests from requests_toolbelt import MultipartEncoder host = 'http://127.0.0.1:81' # 禅道的服务器地址 def login(s,user="admin",psw="e10adc3949ba59abbe56e057f20f883e"): u'''登录禅道''' loginUrl = host+"/zentao/user-login.html" h = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "Referer": host+"/zentao/user-login.html", # "Cookie": # 头部没登录前不用传cookie,因为这里cookie就是保持登录的 "Connection": "keep-alive", "Content-Type": "application/x-www-form-urlencoded", } body = {"account": user, "password": psw, "keepLogin[]": "on", "referer": host+"/zentao/my/" } try: r = s.post(loginUrl, data=body, headers=h) print(r.content) # 打印结果看到location='http://127.0.0.1/zentao/my/'说明登录成功了 if "/zentao/my/" in r.content: print("登录成功!") return True else: print("登录失败:%s" % r.content) return False except Exception as msg: print("登录失败:%s"%str(msg)) return False def upload_jpg(s): u'''上传图片''' url1 = host+"/zentao/file-ajaxUpload-5a26aca290b59.html?dir=image" m = MultipartEncoder( fields={ "localUrl": (None, "1.png"), "imgFile": ("1.png", open("d:\\1.png", "rb"), "image/png") }) try: r1 = s.post(url1, data=m, headers={'Content-Type': m.content_type}) jpg_url = r1.json()["url"] return jpg_url except Exception as msg: print("上传失败:%s"%str(msg)) return "" def submit_bug(s,jpg_url,title="yoyoketang-这是一个带附件的内容"): # 提交bug, 带上附件 url2 = host+"/zentao/bug-create-1-0-moduleID=0.html" m = MultipartEncoder( fields = [ ("product", "1"), ("module","0"), ("project", ""), ("openedBuild[]", "trunk"), ("assignedTo", "admin"), ("type", "codeerror"), ("os", "all"), ("browser", "all"), ("color", ""), ("title", title), # bug标题参数化 ("severity", "3"), ("pri", "0"), ("steps", u'<p>[步骤]</p>\ <p>1、第一步点</p>\ <p>2、第二步点</p>\ <p>3、点三步点</p>\ <p>[结果]</p>\ <p><img src="%s" alt="" /></p>\ <p>[期望]</p>' % jpg_url), # 正文图片地址参数 ("story", "0"), ("task", "0"), ("mailto[]", ""), ("keywords", ""), # 这里的四个参数就是上传文件附件了 ("files[]", ("1.png", open("d:\\1.png", "rb"), "image/png")), # 附件1 ("labels[]", "tu1"), ("files[]", ("2.png", open("d:\\2.png", "rb"), "image/png")), # 附件1 ("labels[]", "tu2"), ("uid", "5a2955c884f98"), ("case", "0"), ("caseVersion", "0"), ("result", "0"), ("testtask", "0") ]) try: r2 = s.post(url2, data=m, headers={'Content-Type': m.content_type}) print r2.content except Exception as msg: print("提交BUG失败:%s"%str(msg)) if __name__ == "__main__": s = requests.session() # 保持会话 login(s, user="admin", psw="e10adc3949ba59abbe56e057f20f883e") # 登录 jpg = upload_jpg(s) # 上传图 # 获取上传图片后用的url地址传给提交bug的正文 submit_bug(s, jpg, title="yoyoketang-这是一个带附件的内容") ```

原文发布于微信公众号 - 从零开始学自动化测试(yoyoketang)

原文发表时间:2017-12-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端生活

JavaWeb(九)Cookie

23670
来自专栏DeveWork

WordPress中当评论审核通过时候给评论者发邮件

如果你的WordPress 站点是开启评论审核的,那么如果能让评论者知道TA 的评论是否通过,就能进一步提升“回头率”。Comment Approved就是这么...

20050
来自专栏

从I/O复用谈epoll为什么高效

上一篇文章中,谈了一些网络编程的基本概念。在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll 很多人提到网络就说epoll,认...

23480
来自专栏魏豪的专栏

【腾讯云的1001种玩法】Nginx网站服务器学习与入门

本文详细介绍了Nginx网站服务器。从Nginx的基本概念,基本应用,高级应用。每种应用都有详细的案例与之对应。可快速帮助Linux爱好者学习Nginx来技术入...

2.2K00
来自专栏峰会SaaS大佬云集

学习笔记---JavaEE复习回顾十一

第三个阶段:RUNTIME 级别,是写好的源码经过编译成字节码, 由类加载器调入JDK运行时内存的阶段。

7200
来自专栏猿人谷

df和du显示的磁盘空间使用情况不一致的原因及处理

在Linux下查看磁盘空间使用情况,最常使用的就是du和df了。然而两者还是有很大区别的,有时候其输出结果甚至非常悬殊。 1. 如何记忆这两个命令 du-Dis...

51090
来自专栏哲学驱动设计

发布 Rafy 源码到 GitHub

最近项目组开始使用 Git 来作为源码管理。我今天就顺便把 Rafy 的源码也迁移到了 github 上,方便大家使用。这是项目的地址:https://gith...

23160
来自专栏Python研发

django-celery定时任务以及异步任务and服务器部署并且运行全部过程

应用Celery之前,我想大家都已经了解了,什么是Celery,Celery可以做什么,等等一些关于Celery的问题,在这里我就不一一解释了。

1.2K20
来自专栏IT 指南者专栏

今天花时间最多的两个小错误

微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、配置Maven项目的pom.xml文件报错 (1)、...

29570
来自专栏LinXunFeng的专栏

一份Cocoapods支持多个target

11730

扫码关注云+社区

领取腾讯云代金券