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-Type 为 multipart/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,可以用标准库 urllib3 或 httpx。httpx 的用法和 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-toolbelt 的 MultipartEncoder:
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())
总结:直接用 requests 的 files 参数最简单。
解决了,上面这个是 requests 的方法
有个 FormRequest 不知是不是你要的

