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

(0)

相关推荐

  • python MultipartEncoder

    模拟浏览器上传文件脚本(Multipart/form-data格式) from requests_toolbelt import MultipartEncoderdata1 = MultipartEn ...

  • 不用微信QQ,用Pillow裁剪图片

    先安装pillow pip install pillow 我们要实现的效果如下,随便找一张图,裁剪后的效果图 首先通过open方法打开图片,得到一个Image对象 from PIL import Im ...

  • 你要偷偷的学Python,然后惊呆所有人(第七天)

    标题无意冒犯,就是觉得这个广告挺好玩的 文章目录 前言 欢迎来到我们的圈子 初见爬虫 为什么是爬虫 通用爬虫架构 爬虫的工作步骤 优秀爬虫的特性 1.高性能 2.可扩展性 3.健壮性 4.友好性 爬虫 ...

  • python接口自动化40-盘点requests那些不常用(面试经常问)的高级技能

    前言 如果面试问你如何用 python 发 get/post 请求? 这种问题只要是个小白花10分钟随便看下博客都能学得会. 面试官如果知道你是资深的,还是初级的呢?面试其实最喜欢考那些你不常用的功能 ...

  • python接口自动化1-发送get请求

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来后面的自动化都离不开它. 一.环境安装 1.用pip安装requests模块 >>p ...

  • python接口自动化2-发送post请求

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  • python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>im ...

  • python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  • python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  • python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  • python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 一.删除草稿箱 1.我们前面讲过登录后保存草稿箱, ...

  • python接口自动化8-参数化

    前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死! 一.登录函数 1. ...