2013-07-24 11 views
5

Mam następujący pogląd:Django Reszta ramowa nie deserializowania dane przekazywane jako surowego JSON

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

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

Działa to dobrze, jeśli dane są przekazywane w formie, jednak jeśli dane są przekazywane jako surowiec JSON Serializator jest tworzony z wszystkimi polami ustawionymi na Brak. Dokumentacja wspomina, że ​​powinno być coś konkretnego do przetwarzania nieprzetworzonego argumentu JSON.

Każda pomoc zostanie doceniona.

UPDATE

Mam następujące prace wokół w celu uczynienia Browsable pracę API zgodnie z oczekiwaniami po przejściu surowego JSON, ale wierzę, że musi być lepszy sposób.

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

Jaki jest błąd? Czy rzeczywiście dostałeś jakiś błąd? –

+0

Serializator inicjowany jest przez Nones. Problem polega na tym, że Browsable API wysyła JSON wewnątrz klucza "_content". Stworzyłem funkcję identyfikującą, kiedy tak jest, i parsowanie jsona do dyktatu, ale uważam, że musi istnieć lepszy sposób. – Raphael

Odpowiedz

8

Uzyskujesz dostęp do danych żądania w niewłaściwy sposób - request.POST obsługuje tylko parsowanie danych wieloczęściowych.

Zamiast tego należy użyć struktury REST request.data. To będzie obsługiwać dane formularzy lub dane json, lub dowolne inne skonfigurowane parsery.

+0

Nic tak jak odpowiedź od twórcy samego ramka :) – Raphael

1

Podejrzewam, że tak właśnie jest w przypadku korzystania z interfejsu Browsable API.

myślę, że nie powinno się używać do przeglądania API przetestować żądanie JSON, zamiast używać curl:

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

Nadzieję, że to pomaga.

+0

Inni programiści oczekują, że będą używać interfejsu API do przeglądania w celu sprawdzenia poprawności ich JSON, a interfejs API do przeglądania ma zakładkę, aby opublikować surowy JSON Zakładam, że jest coś, co sprawi, że serialserer będzie z nim pracować. Napisałem problem na stronie Github projektu. Proste sprawdzenie __init__ Serializera powinno załatwić sprawę i sprawić, by działało po wyjęciu z pudełka. – Raphael

+0

miło, daj mi znać o wyniku;) –

Powiązane problemy