Bạn cần sử dụng files
tham số để gửi yêu cầu POST dạng nhiều phần ngay cả khi bạn không cần tải lên bất kỳ tệp nào.
Từ nguồn yêu cầu ban đầu :
def request(method, url, **kwargs):
"""Constructs and sends a :class:`Request <Request>`.
...
:param files: (optional) Dictionary of ``'name': file-like-objects``
(or ``{'name': file-tuple}``) for multipart encoding upload.
``file-tuple`` can be a 2-tuple ``('filename', fileobj)``,
3-tuple ``('filename', fileobj, 'content_type')``
or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``,
where ``'content-type'`` is a string
defining the content type of the given file
and ``custom_headers`` a dict-like object
containing additional headers to add for the file.
Phần có liên quan là: file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Dựa trên những điều trên, yêu cầu biểu mẫu nhiều đơn giản nhất bao gồm cả hai tệp để tải lên và các trường biểu mẫu sẽ trông như thế này:
multipart_form_data = {
'file2': ('custom_file_name.zip', open('myfile.zip', 'rb')),
'action': (None, 'store'),
'path': (None, '/path1')
}
response = requests.post('https://httpbin.org/post', files=multipart_form_data)
print(response.content)
☝ Lưu ý None
như là đối số đầu tiên trong tuple cho các lĩnh vực văn bản đơn giản - đây là một giữ chỗ cho lĩnh vực tên tập tin đó chỉ được sử dụng cho những lần tải tập tin, nhưng đối với các lĩnh vực văn bản đi qua None
như là tham số đầu tiên là cần thiết để cho các dữ liệu được gửi .
Nhiều trường có cùng tên
Nếu bạn cần đăng nhiều trường có cùng tên thì thay vì từ điển, bạn có thể xác định tải trọng của mình dưới dạng danh sách (hoặc một tuple) của các bộ dữ liệu:
multipart_form_data = (
('file2', ('custom_file_name.zip', open('myfile.zip', 'rb'))),
('action', (None, 'store')),
('path', (None, '/path1')),
('path', (None, '/path2')),
('path', (None, '/path3')),
)
Truyền yêu cầu API
Nếu API ở trên không đủ pythonic cho bạn, thì hãy xem xét sử dụng request requestbelt ( pip install requests_toolbelt
) là phần mở rộng của mô-đun yêu cầu cốt lõi cung cấp hỗ trợ cho phát trực tuyến tệp cũng như MultipartEncoder có thể được sử dụng thay thế files
và cũng cho phép bạn xác định tải trọng là một từ điển, tuple hoặc danh sách.
MultipartEncoder
có thể được sử dụng cả cho các yêu cầu nhiều phần có hoặc không có các trường tải lên thực tế. Nó phải được gán cho data
tham số.
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
multipart_data = MultipartEncoder(
fields={
# a file upload field
'file': ('file.zip', open('file.zip', 'rb'), 'text/plain')
# plain text fields
'field0': 'value0',
'field1': 'value1',
}
)
response = requests.post('http://httpbin.org/post', data=multipart_data,
headers={'Content-Type': multipart_data.content_type})
Nếu bạn cần gửi nhiều trường có cùng tên hoặc nếu thứ tự của các trường biểu mẫu là quan trọng, thì có thể sử dụng một tuple hoặc danh sách thay vì từ điển:
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)