Trying to parse `request.body` from POST in Django

Question:

For some reason I cannot figure out why Django isn’t handling my request.body content correctly.

It is being sent in JSON format, and looking at the Network tab in Dev Tools shows this as the request payload:

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

which is exactly how I want it to be sent to my API.

In Django I have a view that accepts this request as a parameter and just for my testing purposes, should print request.body["content"] to the console.

Of course, nothing is being printed out, but when I print request.body I get this:

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

so I know that I do have a body being sent.

I’ve tried using json = json.loads(request.body) to no avail either. Printing json after setting that variable also returns nothing.

Asked By: Zach

||

Answers:

In Python 3.0 to Python 3.5.x, json.loads() will only accept a unicode string, so you must decode request.body (which is a byte string) before passing it to json.loads().

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

In Python 3.6, json.loads() accepts bytes or bytearrays. Therefore you shouldn’t need to decode request.body (assuming it’s encoded in UTF-8, UTF-16 or UTF-32).

Answered By: Alasdair