2013-07-24 8 views
5

Ich habe die folgende Ansicht:Django Rastrahmen keine Daten deserialisiert als JSON übergeben

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(request.POST) 
     # Do work here 

Das funktioniert gut, wenn die Daten als eine Form übergeben wird, jedoch, wenn die Daten als JSON übergeben wird Der Serializer wird mit allen Feldern, die auf None festgelegt sind, instanziiert. Die Dokumentation erwähnt, dass für die Verarbeitung eines RAW-JSON-Arguments etwas spezifisch sein sollte.

Jede Hilfe wäre willkommen.

UPDATE

Ich habe die folgende Arbeit um, um die Browsable API wie erwartet zu machen, wenn eine rohe JSON vorbei, aber ich glaube, es muss ein besserer Weg geben.

def parse_data(request): 
    # If this key exists, it means that a raw JSON was passed via the Browsable API 
    if '_content' in request.POST: 
     stream = StringIO(request.POST['_content']) 
     return JSONParser().parse(stream) 
    return request.POST 


class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(parse_data(request)) 
     # Do work here 
+0

Was ist der Fehler, den Sie bekommen haben? Oder hast du tatsächlich einen Fehler bekommen? –

+0

Der Serializer wird mit Nones initialisiert. Das Problem besteht darin, dass die Browsable-API den JSON innerhalb eines Schlüssels "_content" sendet. Ich habe eine Funktion erstellt, um festzustellen, wann dies der Fall ist, und den JSON zu einem Diktat zu analysieren, aber ich glaube, dass es einen besseren Weg geben muss. – Raphael

Antwort

8

Sie greifen falsch auf die Anfragedaten zu - request.POST behandelt nur das Parsen von mehrteiligen Daten.

Verwenden Sie stattdessen REST-Framework request.data. Das behandelt entweder Formulardaten, JSON-Daten oder andere Parser, die Sie konfiguriert haben.

+0

Nichts wie eine Antwort vom Schöpfer des Rahmens selbst :) – Raphael

1

Ich denke, das ist die Art, wie es ist, wenn Sie Browsable API dann verwenden.

Ich glaube, Sie nicht Browsable API testen JSON Anforderung verwendet werden soll, verwenden Sie stattdessen curl:

curl -v -H "Content-type: application/json" -X POST -d '{"foo": 1, "bar": 1}' http://127.0.0.1:8000/api/something/ 

Hoffe, es hilft.

+0

Die anderen Entwickler erwarten, die Browsable-API zu verwenden, um ihre JSON zu validieren, und da die Browsable-API eine Registerkarte hat, um Roh-JSON zu posten, nehme ich an, dass es etwas gibt, damit der Serializer damit arbeiten kann. Ich habe ein Problem auf der Github-Seite des Projekts veröffentlicht. Eine einfache Überprüfung des __init__ des Serializers sollte den Zweck erfüllen und es sofort einsatzfähig machen. – Raphael

+0

schön, lassen Sie mich dann das Ergebnis wissen;) –

Verwandte Themen