Sie müssen den files
Parameter verwenden, um eine mehrteilige POST-Anfrage zu senden, auch wenn Sie keine Dateien hochladen müssen.
Aus der ursprünglichen Anforderungsquelle :
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.
Der relevante Teil ist: file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Basierend auf dem oben Gesagten sieht die einfachste mehrteilige Formularanforderung, die sowohl hochzuladende Dateien als auch Formularfelder enthält, folgendermaßen aus:
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)
☝ Beachten Sie das None
als erstes Argument im Tupel für Nur-Text-Felder - dies ist ein Platzhalter für das Dateinamenfeld, das nur für Datei-Uploads verwendet wird, aber für Textfelder, die None
als erster Parameter übergeben werden, ist erforderlich, damit die Daten gesendet werden .
Mehrere Felder mit demselben Namen
Wenn Sie mehrere Felder mit demselben Namen veröffentlichen müssen, können Sie anstelle eines Wörterbuchs Ihre Nutzdaten als Liste (oder Tupel) von Tupeln definieren:
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 für Streaming-Anforderungen
Wenn die oben genannte API für Sie nicht pythonisch genug ist, sollten Sie das Anforderungs-Toolbelt ( pip install requests_toolbelt
) verwenden, eine Erweiterung des Kernanforderungsmoduls, das das Streaming von Datei-Uploads unterstützt, sowie den MultipartEncoder , der anstelle von verwendet werden files
kann und der dies auch ermöglicht Sie definieren die Nutzdaten als Wörterbuch, Tupel oder Liste.
MultipartEncoder
kann sowohl für mehrteilige Anfragen mit als auch ohne tatsächliche Upload-Felder verwendet werden. Es muss dem data
Parameter zugewiesen werden.
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})
Wenn Sie mehrere Felder mit demselben Namen senden müssen oder wenn die Reihenfolge der Formularfelder wichtig ist, kann anstelle eines Wörterbuchs ein Tupel oder eine Liste verwendet werden:
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)