Python post请求发送的是Form Data的类型

常规的Form Data

大部分的Form Data 可以直接都是可以通过正常的post请求进行提交的

import requests

headers = {
    '自己设置的请求头键': '自己设置的请求头键',
    'Content-Type': '网页接受的数据类型'
}

form_data = {
    '对应的键1':'对应的值1',
    '对应的键2':'对应的值2',
}

response = requests.post('需要访问的url地址',data=form_data,headers=headers)
response.close()

特殊的Form Data

        但是有些Form Data 里面的数据是很繁琐的,有一些是以下结构的数据

        decode后的数据是看着比较符合json的格式的

         但是点击【view source】后就发现其根本不是常规的数据,下图就是source数据的样子

        每一个参数,都会已一定固定的格式为开头

        例如:

                ------WebKitFormBoundaryxxxxxxx

                Content-Disposition: form-data; name="upload_sign"

         如果是这样的参数,那就不能用上面提及的方法去发送post请求

解决的办法

通过【MultipartEncoder】库来创建一个form_data对象

安装第三方库 requests-toolbelt,注意是  -  (是减号,不是下划线)才能搜出来

import random
import string
from requests_toolbelt import MultipartEncoder

headers = {
    '自己设置的请求头键': '自己设置的请求头键',
}

# 准备需要post的数据
request_data = {
    'upload_sign': signature,
    'forbid_override': 'false',
    # 携带文件
    # 示例:"file":('file_name', open('file_path', 'rb'), 'file_content_type')
    'file': ("文件名称", "二进制文件数据",'文件类型'),
}

# 这个按照自己需要的来设置
boundary = '----WebKitFormBoundary1hdxbOXZ2CT7I7gW'

# 也可以每次都随机
boundary = f'----WebKitFormBoundary{"".join(random.choices(string.ascii_letters + string.digits, k=16))}'


form_data = MultipartEncoder(fields=request_data, boundary=boundary)
headers['Content-Type'] = form_data.content_type

response = requests.post('需要访问的url地址',data=form_data,headers=headers)
response.close()