Wie kann ich ein "multipart / form-data" mit Anfragen in python senden?

Wie man ein multipart/form-data mit Anfragen in Python sendet? Wie man eine Datei sendet, verstehe ich, aber wie man die Formulardaten nach dieser Methode sendet, kann nicht verstehen.

3 Solutions collect form web for “Wie kann ich ein "multipart / form-data" mit Anfragen in python senden?”

Grundsätzlich, wenn Sie einen Dateiparameter (ein Wörterbuch) angeben, werden dann requests einen multipart/form-data POST anstelle eines application/x-www-form-urlencoded POST application/x-www-form-urlencoded . Sie sind nicht beschränkt auf die Verwendung von tatsächlichen Dateien in diesem Wörterbuch, aber:

 >>> import requests >>> response = requests.post('http://httpbin.org/post', files=dict(foo='bar')) >>> response.status_code 200 

Und httpbin.org lässt Sie wissen, welche Header Sie mit gepostet haben; In response.json() wir:

 >>> from pprint import pprint >>> pprint(response.json()['headers']) {u'Accept': u'*/*', u'Accept-Encoding': u'gzip, deflate, compress', u'Connection': u'close', u'Content-Length': u'141', u'Content-Type': u'multipart/form-data; boundary=33b4531a79be4b278de5f5688fab7701', u'Host': u'httpbin.org', u'User-Agent': u'python-requests/2.2.1 CPython/2.7.6 Darwin/13.2.0', u'X-Request-Id': u'eaf6baf8-fc3d-456b-b17d-e8219ccef1b1'} 

files können auch eine Liste von zweifachen Tupeln, wenn Sie bestellen müssen und / oder mehrere Felder mit dem gleichen Namen:

 requests.post('http://requestb.in/xucj9exu', files=(('foo', 'bar'), ('spam', 'eggs'))) 

Wenn Sie sowohl files als auch data angeben, hängt es von dem Wert der data ab, mit denen der POST-Körper erstellt wird. Wenn data eine Zeichenfolge sind, wird nur sie verwendet werden; Andernfalls werden sowohl data als auch files verwendet, wobei die Elemente in den data zuerst aufgeführt sind.

Da die vorherigen Antworten geschrieben wurden, haben sich Anfragen geändert. Werfen Sie einen Blick auf den Bug-Thread bei Github für mehr Details und diesen Kommentar für ein Beispiel.

Kurz gesagt, der dict wobei der Schlüssel der Name des Formularfeldes ist und der Wert entweder ein String oder ein 2, 3 oder 4-Längen-Tupel ist, wie im Abschnitt POST eine Multipart-codierte Datei im Fordert Schnellstart:

 >>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} 

Im obigen ist das Tupel wie folgt zusammengesetzt:

 (filename, data, content_type, headers) 

Wenn der Wert nur ein String ist, ist der Dateiname derselbe wie der Schlüssel, wie im Folgenden:

 >>> files = {'obvius_session_id': '72c2b6f406cdabd578c5fd7598557c52'} Content-Disposition: form-data; name="obvius_session_id"; filename="obvius_session_id" Content-Type: application/octet-stream 72c2b6f406cdabd578c5fd7598557c52 

Wenn der Wert ein Tupel ist und der erste Eintrag None die Dateinameneigenschaft nicht berücksichtigt:

 >>> files = {'obvius_session_id': (None, '72c2b6f406cdabd578c5fd7598557c52')} Content-Disposition: form-data; name="obvius_session_id" Content-Type: application/octet-stream 72c2b6f406cdabd578c5fd7598557c52 

Sie müssen den files Parameter verwenden, um eine Multipart-Formular-POST-Anfrage zu senden, auch wenn Sie keine Dateien hochladen müssen.

Von den ursprünglichen Anfragen Quelle:

 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. 

Die einfachste Multipart-Formularanforderung, die beide Dateien zum Hochladen und Ausbilden von Feldern enthält, sieht so aus:

 multipart_form_data = { 'file1': open('myfile.zip', 'rb'), 'file2': ('custom_file_name.zip', open('myfile.zip', 'rb')), 'action': ('', 'store'), 'path': ('', '/path1') } response = requests.post('https://httpbin.org/post', files=multipart_form_data) print(response.content) 

Beachten Sie die leere Zeichenfolge als erstes Element im Tupel für Klartextfelder – das ist ein Platzhalter für das Dateinamenfeld, das nur für Datei-Uploads verwendet wird, aber für Textfeld muss der leere Platzhalter vorhanden sein, damit die Daten vorliegen Eingereicht


Wenn diese API ist nicht pythonisch genug für Sie, oder wenn Sie mehrere Felder mit dem gleichen Namen posten müssen , dann erwägen Sie Anfragen Toolbelt ( Pipe pip install requests_toolbelt ), die eine Erweiterung der Kern Requests- Modul, das Unterstützung für Datei-Upload-Streaming als bietet Ebenso wie der MultipartEncoder , der anstelle von files und Parameter sowohl als Wörterbücher als auch als Tupel akzeptiert.

MultipartEncoder kann sowohl für mehrteilige Anfragen mit oder ohne eigentliche Upload-Felder verwendet werden. Sie muss dem Datenparameter zugeordnet sein.

 import requests from requests_toolbelt.multipart.encoder import MultipartEncoder multipart_data = MultipartEncoder( fields={ # a file upload field 'file': ('file.py', open('file.py', '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, dh:

 multipart_data = MultipartEncoder( fields=( ('action', 'store'), ('path', '/path1'), ('path', '/path2'), ('path', '/path3'), ) ) 
  • Python-Anfragen holen eine Datei aus einer lokalen URL ab
  • Wie kann ich den <span> Tag-Inhalt mit der schönen Suppe extrahieren?
  • Verwenden der Python-Requests-Bibliothek, um eine Textdatei zu posten
  • Python-Anfragen verwenden: Sessions, Cookies und POST
  • Wie man ein verschachteltes Wörterbuch an Flask's GET Request Handler übergibt
  • Wie stelle ich den Content-Typ für POST-Anfragen in der Python-Requests-Bibliothek ein?
  • Probleme beim Senden einer Datei an Imgur
  • Das Anfragen Streaming-Beispiel funktioniert nicht in meiner Umgebung
  • Python Requests: Warten Sie nicht, bis die Anfrage beendet ist
  • Wie deaktiviere ich die Cookie-Handhabung mit der Python-Anforderungsbibliothek?
  • Effiziente Lesung von Zeilen aus komprimierten, Chunked HTTP-Stream, wie sie ankommen
  • Python ist die beste Programmiersprache der Welt.