requests-toolbelt

1.官方文档地址: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-这是一个带附件的内容")

最新文章

  1. CSS总则。
  2. 关于__IPHONE_OS_VERSION_MAX_ALLOWED和__IPHONE_OS_VERSION_MIN_ALLOWED的用法
  3. Velocity(10)——指令的转义
  4. call(),apply(),bind()与回调
  5. Php中正则小结(一)
  6. Asp.Net 之 未能加载文件或程序集 system.web.extensions 解决方法
  7. (转)了解了这些才能开始发挥jQuery的威力
  8. Linux查看端口号
  9. 手机低端市场,联发科 vs 高通
  10. 如何用VS2010打开VS2012编辑的项目
  11. Web---&gt;&gt;&gt;Cookie与Session
  12. CSS3 Media Queries 详细介绍与使用方法
  13. Python查询SQLserver数据库备份(抛砖引玉)
  14. 安卓图片加载框架之Glide框架
  15. Spring第一天——入门与IOC
  16. Springmvc的原理和业务处理
  17. FFmpeg 裁剪——音频解码
  18. 【eclipse】聚合工程maven启动Tomcat报错
  19. fm 讲解加代码
  20. DataRowState、AcceptChanges、RejectChanges综合使用示例:实现DataGridView数据的增、删、改

热门文章

  1. 【WebGL】2.基础概念
  2. SPI总线协议介绍
  3. JDK 1.8之 HashMap 源码分析
  4. Ubuntu连接手机步骤
  5. python2 使用matplotlib
  6. iOS常识名词解释 2016/04/05
  7. 每天一个linux命令(磁盘):【转载】du 命令
  8. 每天一个linux命令:【转载】mv命令
  9. Codeforces 9D How many trees? 【计数类DP】
  10. 20179223《Linux内核原理与分析》第四周学习笔记