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'

[步骤]

\

1、第一步点

\

2、第二步点

\

3、点三步点

\

[结果]

\

\

[期望]

' % 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-这是一个带附件的内容")

```

本文来自企鹅号 - 从零开始学自动化测试媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT 指南者专栏

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

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

2917
来自专栏Python研发

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

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

8942
来自专栏技术博文

HTTP状态码查询

如果客户端向服务器发出了某项请求要求显示网站上的某个网页,那么,服务器会返回 HTTP 状态代码以响应该请求。 一些常见的状态代码为: 200 - 服务器...

35310
来自专栏Albert陈凯

linux目录结构和常用命令

一、Linux目录结构 你想知道为什么某些程序位于/bin下,或者/sbin,或者/usr/bin,或/usr/sbin目录下吗?例如,less命令位于/us...

2704
来自专栏LinXunFeng的专栏

一份Cocoapods支持多个target

1123
来自专栏峰会SaaS大佬云集

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

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

690
来自专栏大学生计算机视觉学习DeepLearning

c++ 网络编程(八)TCP/IP LINUX-epoll/windows-IOCP下 socket opoll函数用法 优于select方法的epoll 以及windows下IOCP 解决多

原文链接:https://www.cnblogs.com/DOMLX/p/9622548.html

3274
来自专栏猿人谷

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

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

4609
来自专栏我和未来有约会

分析Silverlight跨域调用

分析Silverlight跨域调用 在silverlight开发的过程中不免要遇到跨域的问题,在这里以跨域调用Webservice为例子来分析一下跨域的问题。...

2038
来自专栏nnngu

Struts2的配置和一个简单的例子

Struts2的配置和一个简单的例子 笔记仓库:https://github.com/nnngu/LearningNotes ---- 简介 这篇文章主要讲如何...

2963

扫码关注云+社区

领取腾讯云代金券