requests-toolsbelt
1.官方文档地址:requests-toolsbelt官方文档
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})
参考代码
登录禅道,提交bug,附带2张图片 #字符串‘’跨行,需要加\
# coding:utf-8
import requests
import re
import hashlib
import json
from requests_toolbelt import MultipartEncoder
host="http://localhost" #禅道服务器地址
user="admin"
pwd="P@ssw0rd"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"}
def getRand(s): #提取rand值
url1=host+"/zentaopms/www/user-login.html"
#s=requests.session()#保存登录
rand=""
while len(rand)!=10:
rs1=s.get(url1,headers=headers)
result1=re.findall(r"id=\'verifyRand\' value=\'(.+?)\'",rs1.text)
rand=result1[0]
return rand
def pwd_rand_md5(pwd,rand): #加密rand 和原密码
pwdmd5=hashlib.md5(pwd.encode(encoding="UTF-8")).hexdigest()
opwd=pwdmd5+rand
fpwd=hashlib.md5(opwd.encode(encoding="UTF-8")).hexdigest()
return fpwd
def login(s,user,pwd): #登录
url2 = host + "/zentaopms/www/user-login.html"
data2={"account":user,
"password":pwd,
"referer":"http://localhost/zentaopms/www/bug-browse-6.html",
"verifyRand":"rand"}
try:
rs2=s.post(url2,data=data2,headers=headers)
rs2.encoding="utf-8"
print(rs2.text)
if "bug-browse-6.html" in rs2.text:
print("登录成功")
return True
else:
print("登录失败:{}".format(rs2.text))
return False
except Exception as msg:
print("登录报错:{}".format(msg))
return False
def up_pic(s):
#编辑bug,备注位置上传图片
#不限定位置,只要上传到禅道服务器,有url就可以
url=host+"/zentaopms/www/file-ajaxUpload-5f2a476cb1733.html?dir=image"
mm=MultipartEncoder(
fields={#"localurl":"E:\\33.png",
"imgFile":("33.png",open("E:\\33.png","rb"),"image/png")
}
)
try:
rs=s.post(url,data=mm,headers={"Content-Type":mm.content_type})
rs.encoding="utf-8"
pic_url=rs.json()["url"]
return pic_url
except Exception as msg:
print("上传报错:{}".format(msg))
return False
def add_bug(s,purl,title):
#提交bug,带图片、附件
url=host+"/zentaopms/www/bug-create-6-0-moduleID=0.html"
dd=MultipartEncoder(
fields=[
('product','6'),
('module','0'),
('project','5'),
('openedBuild[]','trunk'),
('assignedTo','huyongqin'),
('type','codeerror'),
('title',title),
('severity','3'),
('pri','3'),
('steps','<img src="%s" alt="" />\
<p>[步骤]</p>\
<br />\
<p>[结果]</p>\
<br />\
<p>[期望]</p>\
<br />'%purl),
('oldTaskID','0'),
('labels[]','qq.png'),
('files[]',('qq.png',open("E:\\qq.png","rb"),'image/jpeg')), #附件1
('labels[]','33.png'),
('files[]',('33.png',open('E:\\33.png','rb'),'image/jpeg')),#附件2
('uid','5f2a5073311ef'),
('case','0'),
('caseVersion','0'),
('result','0'),
('testtask','0'),
])
try:
res=s.post(url, data=dd, headers={'Content-Type':dd.content_type})
res.encoding="utf-8"
return res.text
except Exception as msg:
print("提交bug错误:{}".format(msg))
return False
if __name__=="__main__":
s=requests.session() #保持会话
rand=getRand(s) #获取rand值
print(rand)
fpwd=pwd_rand_md5(pwd,rand) #生成最终密码
login(s,user,fpwd) #登录
purl=up_pic(s)#上传图片,生成url
print(purl)
rs=add_bug(s,purl,"测试标题0805")
print(rs)
运行结果
刚刚提交的bug如下图
登录开源系统OPMS
import requests
from requests_toolbelt import MultipartEncoder
#登录开源系统OPMS
url="http://47.98.106.11:8008/login"
s=requests.session()
#方式1 #注意这里的 "fields="可以不写
# m=MultipartEncoder(
# fields={
# "username":"libai",
# "password":"123456"
# }
# )
# r=s.post(url,data=m,headers={'Content-Type':m.content_type})
#方式2
# n=MultipartEncoder(
# [
# ("username","libai"),
# ("password","123456")
# ]
# )
# r=s.post(url,data=n,headers={'Content-Type':n.content_type}) #注意这里的 "fields="可以不写
#方式3
r=s.post(url,data={"username":"libai","password":"123456"})
print(r.json())
运行结果