2013-07-24 5 views
5

Ho la seguente vista:Django Riposo quadro non deserializzare dati passati come JSON grezzo

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

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

Questo funziona bene se il dato viene passato come forma, tuttavia, se i dati viene passato come JSON grezzo il serializzatore viene istanziato con tutti i suoi campi impostati su Nessuno. La documentazione dice che dovrebbe esserci qualcosa di specifico per l'elaborazione di un argomento JSON non elaborato.

Qualsiasi aiuto sarebbe apprezzato.

UPDATE

Ho il seguente lavoro intorno al fine di rendere il lavoro API Browsable come previsto quando si passa una JSON crudo ma che ci deve essere un modo migliore.

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

qual è l'errore che hai ottenuto? O hai effettivamente ricevuto qualche errore? –

+0

Il serializzatore è inizializzato con Nones. Il problema è che l'API Sfogliabile invia il JSON all'interno di una chiave '_content'. Ho creato una funzione per identificare quando questo è il caso e parsing the json to a dict ma credo che ci deve essere un modo migliore. – Raphael

risposta

8

Stai accedendo ai dati della richiesta nel modo sbagliato - request.POST gestisce solo l'analisi dei dati multipart.

Utilizzare invece il framework REST request.data. Questo gestirà sia i dati del modulo, o dati JSON, o qualsiasi altro parser che hai configurato.

+0

Niente come una risposta dal creatore del quadro stesso :) – Raphael

1

Suppongo che sia così quando si utilizza l'API Sfogliabile quindi.

penso che non si dovrebbe usare API sfogliabile per testare richiesta JSON, usate invece curl:

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

Speranza che aiuta.

+0

Gli altri sviluppatori si aspettano di utilizzare l'API Sfogliabile per convalidare il loro JSON e come l'API navigabile ha una scheda per pubblicare JSON non elaborato. Presumo che ci sia qualcosa per far funzionare il serializzatore con quello. Ho pubblicato un problema sulla pagina Github del progetto. Un semplice controllo su __init__ del Serializer dovrebbe fare il trucco e farlo funzionare immediatamente. – Raphael

+0

bello, fammi sapere del risultato quindi;) –