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())

 运行结果

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值