Você precisa usar o files
parâmetro para enviar uma solicitação POST de formulário com várias partes, mesmo quando não precisar fazer upload de nenhum arquivo.
Na fonte de solicitações originais :
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.
A parte relevante é: file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Com base no exposto acima, a solicitação de formulário multipartes mais simples que inclui os arquivos para upload e os campos do formulário será semelhante a:
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)
☝ Observe None
como o primeiro argumento na tupla para campos de texto sem formatação - este é um espaço reservado para o campo nome do arquivo que é usado apenas para upload de arquivos, mas para campos de texto que passam None
como o primeiro parâmetro é necessário para que os dados sejam enviados .
Vários campos com o mesmo nome
Se você precisar postar vários campos com o mesmo nome, em vez de um dicionário, poderá definir sua carga como uma lista (ou uma tupla) de tuplas:
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 de solicitações de streaming
Se a API acima não for suficientemente pitônica para você, considere o uso de orders toolbelt ( pip install requests_toolbelt
), que é uma extensão do módulo de solicitações principais que fornece suporte para streaming de upload de arquivos, bem como o MultipartEncoder que pode ser usado em vez de files
, e que também permite você define a carga útil como dicionário, tupla ou lista.
MultipartEncoder
pode ser usado para solicitações de várias partes com ou sem campos de upload reais. Ele deve ser atribuído ao data
parâmetro.
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})
Se você precisar enviar vários campos com o mesmo nome ou se a ordem dos campos do formulário for importante, uma tupla ou uma lista poderá ser usada em vez de um dicionário:
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)