6

I am posting some raw JSON to my backend

{
    "access_token": "hU5C7so4reJOYTzPyhKPs8PWq07tb",
    "id": 3,
    "order_details": [{"meal_id": 1, "quantity": 3}, {"meal_id": 2, "quantity": 2}]
}

However when I try to

print (request.POST.get("access_token")) 

I receive None

But, when I do

print (request.body)

The values seem to there: b'{\n\t"access_token": "hU5C7so4reJOYTzPyhKPs8PWq07tb",\n\t"id": 3,\n\t",\n\t"order_details": [{"meal_id": 1, "quantity": 3}, {"meal_id": 2, "quantity": 2}]\n}'

I am using Postman to post the data.

I want to store the access token into some variable like so:

access_token = request.POST.get("access_token")

with the post data

I am still fairly new to Django, any help would be great.

Simon
  • 6,413
  • 6
  • 34
  • 57

3 Answers3

4

Request.POST gets populated when you are sending form data. see django doc, and this answer for details. Since, in your case, you are posting 'plain' json, you will find your payload under request.body. You can decode the body from binary to a dict as follows:

import json

body = json.loads(request.body.decode('utf-8'))
access_token = body.get("access_token")
Fred
  • 635
  • 9
  • 18
  • some explanation why this answer is an improvement over the other answers will help it. – rene Feb 04 '19 at 20:55
3

Just doing a json.loads should work.

import json

json_data = json.loads(request.body)
SuperNova
  • 25,512
  • 7
  • 93
  • 64
  • 1
    body needs to be decoded. otherwise you get TypeError: the JSON object must be str, not 'bytes' – Fred Feb 04 '19 at 19:42
-1

you need to decode the json first:

import json
variable = urlopen(request).read().decode('utf-8')
json_obj = json.loads(variable)

then you can retrive your informations

for i in json_obj:
   token = i['access_token']
   order_details = i['order_details']

Hope this help

Mattia
  • 961
  • 13
  • 25
  • 1
    This isn't relevant to this use case, which is a backend endpoint receiving a POST request. – Fred Feb 04 '19 at 19:44