Python中如何生成form-data的模块?

经常用 scrapy 框架,但是这个框架的 GET/POST 方法没有抽象出上传文件的参数,想问下自带的库或者 scrapy 有没有生成 form-data 的模块,丢进去一个文件,然后就生成出对应的报文。。

— xxx — 
Content-Disposition: form-data; name=” name ”

zhangsan — xxx — Content-Disposition: form-data; name=” from ”

beijing — xxx — Content-Disposition: file; name=” record ”; filename=” record.txt ” Content-Type: text/plain


Python中如何生成form-data的模块?

4 回复

from requests.models import encode_multipart_formdata


requests 库的 files 参数最直接,它会自动处理 Content-Typemultipart/form-data

import requests

url = 'https://httpbin.org/post'
files = {'file': ('test.txt', open('test.txt', 'rb'), 'text/plain')}
data = {'key1': 'value1', 'key2': 'value2'}

response = requests.post(url, files=files, data=data)
print(response.json())

如果不用 requests,可以用标准库 urllib3httpxhttpx 的用法和 requests 几乎一样:

import httpx

with httpx.Client() as client:
    files = {'file': ('test.txt', open('test.txt', 'rb'), 'text/plain')}
    data = {'key1': 'value1'}
    response = client.post('https://httpbin.org/post', files=files, data=data)
    print(response.json())

对于更复杂的场景(比如嵌套字段),可以用 requests-toolbeltMultipartEncoder

from requests_toolbelt import MultipartEncoder
import requests

encoder = MultipartEncoder(
    fields={
        'field0': 'value',
        'field1': ('filename', open('file.txt', 'rb'), 'text/plain'),
        'field2': ('other_file', open('other.bin', 'rb'), 'application/octet-stream')
    }
)

response = requests.post('https://httpbin.org/post', 
                         data=encoder,
                         headers={'Content-Type': encoder.content_type})
print(response.json())

总结:直接用 requestsfiles 参数最简单。

解决了,上面这个是 requests 的方法

有个 FormRequest 不知是不是你要的

回到顶部