MultiPartParserError :- Ungültige Grenze
Ich versuche, um Daten zu senden und die Datei mit Python-requests-Modul zu meinem django-rest-Anwendung bekomme aber immer die folgende Fehlermeldung.
raise MultiPartParserError('Invalid boundary in multipart: %s' % boundary)
MultiPartParserError: Invalid boundary in multipart: None
Code:-
import requests
payload={'admins':[
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'[email protected]'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'[email protected]'
}
],
'company-detail':{'description':'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'}
}
files = {'upload_file':open('./test.py','rb')}
import json
headers = {'content-type' : 'application/json'}
headers = {'content-type' : 'multipart/form-data'}
#r = requests.post('http://127.0.0.1:8080/api/create-company-profile/',data=json.dumps(payload),headers=headers,files=files)
r = requests.post('http://127.0.0.1:8080/api/create-company-profile/',data=payload,headers=headers,files=files)
print r.status_code
print r.text
Django-code:-
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,)
def post(self, request, *args, **kwargs):
print 'request ==', request.data
- Sie haben ausdrücklich Hinzugefügt, die multipart-header, der sollte einen
;boundary=<value>
- daher Django scheitern.requests
nicht überschreiben Ihre Header, damit Ihre falschen header verwendet wird. Ich würde Sie einfach lassenrequests
tun Sie es, und entfernen Sie dieheaders =
code. - Ich habe eine
django-rest-framework
tag zu Ihrer Frage. Ich hoffe, Sie nicht mind.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, vergaß ich über dem Header. Nach die Skillung:
Hier ist, was eine Anfrage mit multipart/form-data sieht wie folgt aus:
Sehen, wie die Abschnitte der Daten sind getrennt durch die Grenze:
Die Idee ist, etwas zu verwenden, für eine Grenze, die wahrscheinlich in den Daten auftauchen. Beachten Sie, dass die Grenze war in der
Content-Type
- header der Anforderung an.Diese Anfrage wurde von diesem code:
Es sieht aus wie Sie wurden unter sorgfältiger Beachtung der folgenden Notiz in der django-rest-framework docs:
Aber wenn Sie mit
requests
wenn Sie angeben, dieContent-Type
header selbst, dannrequests
davon ausgegangen, dass Sie wissen, was Sie tun, und Sie werden nicht überschreiben IhrContent-Type
header mit derContent-Type
Kopf-es würde zur Verfügung gestellt haben.Sie nicht die Grenze Ihrer
Content-Type
header--wie erforderlich. Wie konntest du nur? Sie wusste nicht, montieren Sie die Anfrage und erstellen Sie eine Grenze für die Trennung der verschiedenen Stücke von Daten, so dass Sie gar nicht wissen, was die Grenze ist.Wenn die
django-rest-framework
Hinweis sagt, dass Sie sollten auch eineContent-Type
- header in der Anfrage, was das wirklich bedeutet, ist:Also @AChampion war genau richtig in den Kommentaren: lassen Sie
requests
bieten dieContent-Type header
nach all denrequests
docs werben:requests
funktioniert wie folgt: wenn Sie einefiles
keyword arg, dann Anfragen verwendet eineContent-Type
headermultipart/form-data
und gibt auch eine Grenze im Kopf; dannrequests
montiert die Körper der Anfrage über die Grenze. Wenn Sie einedata
keyword argument fordert dann verwendet eineContent-Type
vonapplication/x-www-form-urlencoded
, die einfach montiert werden alle Schlüssel und Werte in das Wörterbuch, in diesem format:Keine Grenze erforderlich.
Und, wenn Sie beide eine
files
keyword-arg und einedata
keyword arg, dann Anfragen verwendet eineContent-Type
vonmultipart/form-data
.Ich habe versucht den code mit einem
CreateAPIView
von der django-rest-framework. Nach der Befestigung alle vorbereitenden Fehler, dass Ihr code produziert, konnte ich nicht reproduzieren, ein boundary-Fehler.Verzeichnis-Struktur:
my_app/views.py:
myapp/serializers.py:
myapp/urls.py:
my_site/urls.py:
myapp/models.py:
my_site/settings.py:
Hinweis, dass ich nicht zu deaktivieren, csrf-tokens.
requests_client.py:
Ausgang request_client.py terminal-Fenster:
Ausgabe in django-server-Fenster:
By the way, hier ist eine weniger schmerzhafte Weise zu Lesen, django ' s umfangreiche html-Fehlermeldungen bei der Verwendung von
requests
während der Entwicklung:Dann in Ihrem browser:
"und navigieren Sie zu
error.html
. Lesen Sie die Fehler-Beschreibung in Ihrem browser, dann auf die Spur, was ist falsch in Ihren django-Projekt.Dann kommen Sie zurück zu Ihrem terminal-Fenster und drücken Sie die up-Taste auf Ihrer Tastatur, um zurück zu bekommen:
Treffer
Return
, dann aktualisieren Sie das browser-Fenster, das angezeigt wirderror.html
. So oft wie nötig wiederholen. (Machen Sie nicht den Fehler, immer wieder erfrischend deine browser und dachte, dass ist, senden Sie eine neue Anforderung: Sie haben zu laufen request_client.py wieder so senden Sie eine neue Anfrage).Beim hochladen der Datei mit den Parametern:
Nicht überschreiben der Header
Setzen andere Parameter zusammen mit upload_file in Dateien dict.
Um
requests
musste ich deaktivierencsrf tokens
in meinem django-Projekt, sonst bekam ich Fehler beim senden der post-Anforderungen:settings.py:
Weiter, Ihre
payload
ist nicht json-Daten. json-Daten einen string, aber Ihrepayload
ist ein python-dictionary. Und man kann nicht einfach wickeln Sie Anführungszeichen, um Ihrem Wörterbuch, da json-Daten enthalten, nicht einzelne Anführungszeichen -, die Sie ausschließlich verwendet. So müssen Sie konvertieren Sie Ihre python-Wörterbuch auf json.Hier ist die
requests
client:Sehen die Erweiterte Verwendung Abschnitt der
requests
docs.Hier ist es mit einem django class based view (wenn auch nicht
Django Rest Framework
Klasse view):Ausgabe im client-Fenster an:
Ausgabe in django-server-Fenster:
Offenbar, die
requests <--> django mind meld
können Sie mix-POST-Daten mit multipart/form-Daten, und Sie können dies tun:Gepaart mit dieser Ansicht:
Bekomme ich die folgende Ausgabe in den server-Fenster:
Damit für UTF-8-Zeichen in dem Wörterbuch, müssen Sie einige zusätzliche Schritte bei der Konvertierung nach json. Sehen hier.