python接口自动化(十六) requests-toolbelt处理multipart/form-data
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())
运行结果
越努力,越幸运!!!
good good study,day day up!!!