zoukankan      html  css  js  c++  java
  • python接口自动化7-post文件上传

    前言

    文件上传在我们软件是不可少的,最多的使用是体现在我们后台,当然我们前台也会有。但是了解过怎样上传文件吗?这篇我们以禅道文档-创建文档,上传文件为例。

    post请求中的:Content-Type:multipart/form-data  这种类型便是上传文件。

    一、环境安装、抓包分析

    1、pip install requests_toolbelt,post请求 multipart/form-data  类型

    C:UsersAdministrator>pip install requests_toolbelt
    Requirement already satisfied: requests_toolbelt in d:path_pythonlibsite-packages (0.9.1)
    Requirement already satisfied: requests<3.0.0,>=2.0.1 in d:path_pythonlibsite-packages (from requests_toolbelt) (2.20.1)
    Requirement already satisfied: chardet<3.1.0,>=3.0.2 in d:path_pythonlibsite-packages (from requests<3.0.0,>=2.0.1->requests_toolbelt) (3.0.4)
    Requirement already satisfied: certifi>=2017.4.17 in d:path_pythonlibsite-packages (from requests<3.0.0,>=2.0.1->requests_toolbelt) (2019.6.16)
    Requirement already satisfied: idna<2.8,>=2.5 in d:path_pythonlibsite-packages (from requests<3.0.0,>=2.0.1->requests_toolbelt) (2.7)
    Requirement already satisfied: urllib3<1.25,>=1.21.1 in d:path_pythonlibsite-packages (from requests<3.0.0,>=2.0.1->requests_toolbelt) (1.24.3)

    2、先抓下登录接口,因为先登录成功后才能上传文件。写上登录代码,让其能正常登录。

    import requests
    
    s = requests.session()
    login_url = 'http://127.0.0.1/zentao/user-login.html'       # 登录url
    data = 'account=admin&password=e10adc3949ba59abbe56e057f20f883e&keepLogin%5B%5D=on&referer=http%3A%2F%2F127.0.0.1%2Fzentao%2Fdoc-browse-1-byModule-0-id_desc-doc.html'
    login_r = s.post(login_url, params=data)                         # 传 params 参数
    
    r1 = s.get('http://127.0.0.1/zentao/doc-browse-1-byModule-0-id_desc-doc.html')  # 登录访问的 html
    print(r1.content.decode('utf-8'))

     2、操作上传文件(文件我就上传一个桌面的:test.png),fiddler 切换至WebForms就看得比较清楚了。

    二、写python代码请求

    1、将抓包的接口写下,顺序:调试登录、上传、检查点。

    2、也需导入模块from requests_toolbelt import MultipartEncoder

    3、MultipartEncoder 传的参数注意,特别是图片参数,这里list里面元组:fields=[(name,value), (name2, value)]

    4、禅道文件上传代码参考如下:

    from requests_toolbelt import MultipartEncoder
    import requests
    
    # 登录
    s = requests.session()
    login_url = 'http://127.0.0.1/zentao/user-login.html'
    data = 'account=admin&password=e10adc3949ba59abbe56e057f20f883e&keepLogin%5B%5D=on&referer=http%3A%2F%2F127.0.0.1%2Fzentao%2Fdoc-browse-1-byModule-0-id_desc-doc.html'
    login_r = s.post(login_url, params=data)  # 传 params 参数
    
    # 断言是否登录成功
    r1 = s.get('http://127.0.0.1/zentao/doc-browse-1-byModule-0-id_desc-doc.html')
    if '产品主库' in r1.content.decode('utf-8'):
        print('登录成功')
    else:print('登录失败')
    
    # 文件上传保存
    # 传参数,name 对应 value,注意图片路径的填写。为空的一些参数不影响的去前提下可以删除。
    s_url = 'http://127.0.0.1/zentao/doc-create-1-0.html'
    body = MultipartEncoder(
        fields=[
            ('lib', '1'),
            ('uid', '5dec436e32b85'),
            ('module', '0'),
            ('title', '我的一个title'),
            ('type', 'text'),
            ('contentType', 'html'),
            ('files[]', ('test.png', open('C:\Users\Administrator\Desktop\test.png', 'rb'), 'image/png'))
        ])
    r2 = s.post(s_url, data=body, headers={'Content-Type': body.content_type})      # Content-Type 自动获取
    
    # 检查是否成功上传图片
    res = s.get('http://127.0.0.1/zentao/doc-browse-1.html')
    if '我的一个title' in res.content.decode('utf-8'):
        print('已上传成功')
    else:print('上传失败')

     5、python控制台说“已上传成功”,但是我们首次执行最好还是肉眼看一下有没有问题。(下图显然没有问题)

    但说到这里,不得不说这只是一次的测试请求,但是以后迭代,无数次回归咋办呢?这个问题和我们手工操作是一样的,好比如你想title每次都一样,但是只能存在一条数据。

    那么就可以①逻辑删除:操作删除按钮、物理删除:连接数据库执行删除语句。欢迎来QQ交流群:482713805

  • 相关阅读:
    HDU 2594 扩展kmp模板题
    HDU 1358 简单kmp
    HDU 3336 扩展kmp
    SPOJ SUBLEX 求第k小子串
    Codeforces 235C
    HDU 4622 Reincarnation
    HDU 4622 求解区间字符串中的不同子串的个数
    [LeetCode] Length of Last Word 字符串查找
    [LeetCode] Sudoku Solver 解数独,递归,回溯
    [LeetCode] Longest Common Prefix 字符串公有前序
  • 原文地址:https://www.cnblogs.com/gsxl/p/11964176.html
Copyright © 2011-2022 走看看