2015-08-14 8 views
11

Ich versuche, ein Bild in django Rest hochladen mit multipart/form-data in einem PUT Anfrage und Kissen:PUT-Anforderung für die Bildarbeits hochladen nicht in django Rest

class ABC(APIView): 
    parser_classes = (MultiPartParser,) 
    def put(self, request): 
     a = Image() 
     a.image_url = request.data["image"] 
     a.save() 

class Image(models.Model): 
     image_url = models.ImageField(upload_to='static/bills', blank=True) 

ich eine Anfrage, die eine PUT-Anforderung ist und ein Multipart/Formulardaten. Ich bekomme am Ende einen Antwortcode von 400 mit der Nachricht:

{ 
    "detail": "Multipart form parse error - Invalid boundary in multipart: None" 
} 

Irgendwie ist dies gerade jetzt gebrochen. Es funktionierte gut, als ich es das erste Mal schrieb. Seitdem habe ich einige Einstellungen Konfiguration für CORS-Anfragen wie hinzugefügt:

CORS_ORIGIN_ALLOW_ALL = True 

CORS_ALLOW_HEADERS = (
    'x-requested-with', 
    'content-type', 
    'accept', 
    'origin', 
    'authorization', 
    'x-csrftoken', 
    'token', 
    'x-device-id', 
    'x-device-type', 
    'x-push-id', 
    'dataserviceversion', 
    'maxdataserviceversion' 
) 
CORS_ALLOW_METHODS = (
     'GET', 
     'POST', 
     'PUT', 
     'PATCH', 
     'DELETE', 
     'OPTIONS' 
    ) 

Irgendwelche Ideen?

OPTIONS Anfrage Antwort:

Access-Control-Allow-Headers → x-requested-with, content-type, accept, origin, authorization, x-csrftoken, token, x-device-id, x-device-type, x-push-id, dataserviceversion, maxdataserviceversion 
    Access-Control-Allow-Methods → GET, POST, PUT, PATCH, DELETE, OPTIONS 
    Access-Control-Allow-Origin → * 
    Access-Control-Max-Age → 86400 
    Allow → GET, POST, DELETE, HEAD, OPTIONS 
    Content-Type → application/json 
    Date → Fri, 21 Aug 2015 06:23:28 GMT 
    Server → WSGIServer/0.1 Python/2.7.6 
    Vary → Accept 
    X-Frame-Options → SAMEORIGIN 
+0

Können Sie die Browser-Anfrage als gefangen in Sniffer hinzufügen? – Skarlinski

+0

Kein Schnüffler. Ich benutze einen Postboten, um diese Anfrage zu stellen. –

+2

Können Sie eine 'OPTIONS'-Anfrage an dieselbe URL senden und überprüfen, wie die Antwort lautet? Für einen gültigen CORS-Dienst sollte die Antwort eine leere '200 OK'-Antwort mit Headern wie' Zugriffssteuerung-Zulassen-Methoden, Zugriffssteuerung-Zulassen-Ursprung 'usw. sein. – activatedgeek

Antwort

15

Durch Entfernen des Inhaltstyps aus den Headern wird dies behoben.

+0

Arbeitete auch für mich. Irgendeine Idee, warum es doch funktionierte? – Shivendra

+0

Wenn Sie POSTMAN verwenden, gibt es einen Abschnitt, in dem Sie den Code für die Anfrage in verschiedenen Sprachen anzeigen können. Dies dient als Anhaltspunkt. –

+0

hat auch für mich funktioniert! Danke Mann, aber eine Frage: Weißt du, warum es funktioniert hat? –

1

Sie wollen typischerweise sowohl FormParser und MultiPartParser zusammen verwenden, um Daten vollständig HTML-Formular zu unterstützen.

1

Ihr Fehler sagt Ihnen, dass die Grenze für Ihre multipart/form-data Inhalt Ihrer Anfrage ungültig ist - insbesondere ist das None. Dies gibt von Entwurf einen Antwortcode 400 ("Bad Request") zurück. Der Fehler wird ausgelöst here in the django code.

Um diesen Code-Zweig mit boundary gleich None eingeben bedeutet, dass die boundary Option nicht in der content-type Header Ihrer Anfrage angegeben ist.

boundary muss angegeben werden, wenn multipart/form-data in content-type, wie in RFC2046 angegeben (nach RFC2388) - insbesondere Abschnitt 5.1.1

Das Content-Type Feld für mehrteilige Einheiten erfordert einen Parameter, " Grenze".

Sie sagen, dass es vorher gearbeitet hat, so sollten Sie den Code überprüfen, die Sie verwenden, um die Anforderung zu machen - etwas geändert haben muss bedeuten, dass die boundary nicht in der content-type angegeben ist.

N.B. Ich nehme an, die Anfrage ist Code-generiert, wie <form method="put"> is invalid HTML und so eine Anfrage von einem Browser generiert, da HTML wäre eine GET anstatt eine PUT.

+0

Ich benutze Postbote, um die Anfrage zu stellen. –

+0

Können Sie die Curl-Anfrage teilen, die ich für diese Art von Anfrage verwenden soll? Ich bin nicht so vertraut mit ihm und Zweifel über die API verwirrt mich nur über die Curl Anfrage. –

+0

So etwas wie 'curl -v -XPUT -H 'Inhaltstyp: multipart/form-data; boundary = -------------------------- --4ebf00fbcf09 "--data-binary @ test.jpg http: // ' sollte funktionieren, wobei der String, der auf 'boundary =' folgt, beliebig ist, aber in den folgenden Daten nicht vorkommen darf. Ich gehe davon aus, dass sich Ihre Bilddaten in einer Datei namens "test.jpg" befinden, aber Sie könnten auch die Rohdaten dorthin legen. –