Вам потрібно скористатися files
параметром для надсилання запиту POST на багаточастинні форми навіть у тому випадку, коли вам не потрібно завантажувати жодні файли.
З початкового джерела запитів :
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.
Відповідна частина: file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Виходячи з вищезазначеного, найпростіший запит форми на кілька частин, що включає в себе обидва файли для завантаження та поля форми, виглядатиме так:
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)
☝ Зверніть увагу на None
перший аргумент у кортежі для простих текстових полів - це заповнювач для поля імені файлу, який використовується лише для завантаження файлів, але для текстових полів, що передаються None
як перший параметр, необхідний для подання даних .
Кілька полів з однаковою назвою
Якщо вам потрібно опублікувати декілька полів з однаковою назвою, то замість словника ви можете визначити свій корисний вантаж як список (або кортеж) кортежів:
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 потокових запитів
Якщо вищевказаний API недостатньо пітонічний для вас, тоді слід подумати про використання інструментальних запитів запитів ( pip install requests_toolbelt
), що є розширенням модуля основних запитів, що забезпечує підтримку потокового завантаження файлів, а також MultipartEncoder, який може використовуватися замість files
, а також дозволяє Ви визначаєте корисне навантаження як словник, кортеж або список.
MultipartEncoder
може використовуватися як для запитів із кількома частинами, так і без фактичних полів завантаження. Він повинен бути призначений data
параметру.
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})
Якщо вам потрібно надіслати кілька полів з однаковою назвою або якщо порядок форм форм важливий, то замість словника можна використовувати кортеж або список:
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)