2015-04-21 17 views
26

Z jakiegoś powodu nie mogę zrozumieć, dlaczego Django nie obsługuje poprawnie mojej zawartości request.body.Próba przeanalizowania `request.body` z POST w Django

To jest wysyłany w formacie JSON, a patrząc na karcie w Dev Narzędzia Network pokazuje to jako żądanie ładowności:

{creator: "creatorname", content: "postcontent", date: "04/21/2015"} 

który jest dokładnie tak, jak chcę być wysłany do mojego API.

W Django mam widok, który akceptuje to żądanie jako parametr i tylko do celów testowych powinien wydrukować request.body["content"] do konsoli.

Oczywiście, nic nie jest drukowane, ale podczas drukowania request.body uzyskać to:

b'{"creator":"creatorname","content":"postcontent","date":"04/21/2015"}' 

więc wiem, że zrobić mieć ciało wysyłane.

Próbowałem też użyć json = json.loads(request.body) bez skutku. Drukowanie json po ustawieniu tej zmiennej również nie zwraca nic.

Odpowiedz

76

W Pythonie 3.0 do Python 3.5.x, json.loads() przyjmuje tylko ciąg Unicode, więc trzeba zdekodować request.body (który jest ciągiem bajtów) przed przekazaniem go do json.loads().

body_unicode = request.body.decode('utf-8') 
body = json.loads(body_unicode) 
content = body['content'] 

W języku Python 3.6, json.loads() accepts bytes or bytearrays. Dlatego nie trzeba dekodować request.body (zakładając, że jest zakodowany w UTF-8, UTF-16 lub UTF-32).

+0

To rozwiązało mój problem! A dostęp do elementów działa jak 'body ['keyname']'. Dziękuję Ci bardzo. – Zach

+0

To było bardzo wnikliwe po niezliczonych nocach –

Powiązane problemy