Anda perlu menggunakan files
parameter untuk mengirim permintaan POST bentuk multi-bagian bahkan ketika Anda tidak perlu mengunggah file apa pun.
Dari sumber permintaan asli :
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.
Bagian yang relevan adalah: file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Berdasarkan hal di atas, permintaan formulir multi-bagian paling sederhana yang mencakup file untuk diunggah dan bidang formulir akan terlihat seperti ini:
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)
☝ Catat None
sebagai argumen pertama dalam tupel untuk bidang teks biasa - ini adalah penampung untuk bidang nama file yang hanya digunakan untuk unggahan file, tetapi untuk bidang teks yang lewat None
karena parameter pertama diperlukan agar data yang akan dikirim .
Beberapa bidang dengan nama yang sama
Jika Anda perlu memposting beberapa bidang dengan nama yang sama, alih-alih sebagai kamus, Anda dapat menentukan payload Anda sebagai daftar (atau tuple) dari tuple:
multipart_form_data = (
('file2', ('custom_file_name.zip', open('myfile.zip', 'rb'))),
('action', (None, 'store')),
('path', (None, '/path1')),
('path', (None, '/path2')),
('path', (None, '/path3')),
)
API permintaan streaming
Jika API di atas tidak cukup pythonic untuk Anda, maka pertimbangkan untuk menggunakan permintaan toolbelt ( pip install requests_toolbelt
) yang merupakan perpanjangan dari modul permintaan inti yang menyediakan dukungan untuk streaming unggah file serta MultipartEncoder yang dapat digunakan sebagai penggantifiles
, dan yang juga memungkinkan Anda mendefinisikan payload sebagai kamus, tuple atau daftar.
MultipartEncoder
dapat digunakan baik untuk permintaan multi bagian dengan atau tanpa bidang unggahan yang sebenarnya. Itu harus ditugaskan ke data
parameter.
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})
Jika Anda perlu mengirim beberapa bidang dengan nama yang sama, atau jika urutan bidang isian penting, maka tupel atau daftar dapat digunakan sebagai pengganti kamus:
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)