87

I want to post some JSON using HTTP POST request and receive this data in Django.
I tried to use request.POST['data'], request.raw_post_data, request.body but none are working for me.

My views.py is:

import json
from django.http import StreamingHttpResponse
def main_page(request):
    if request.method=='POST':
            received_json_data=json.loads(request.POST['data'])
            #received_json_data=json.loads(request.body)
            return StreamingHttpResponse('it was post request: '+str(received_json_data))
    return StreamingHttpResponse('it was GET request')

I am posting JSON data using requests module.

import requests  
import json
url = "http://localhost:8000"
data = {'data':[{'key1':'val1'}, {'key2':'val2'}]}
headers = {'content-type': 'application/json'}
r=requests.post(url, data=json.dumps(data), headers=headers)
r.text

r.text should print that message and posted data but I am not able to solve this simple problem. Please tell me how to collect posted data in Django?

1

4 Answers 4

155

You're confusing form-encoded and JSON data here. request.POST['foo'] is for form-encoded data. You are posting raw JSON, so you should use request.body.

received_json_data=json.loads(request.body)
Sign up to request clarification or add additional context in comments.

2 Comments

request.body contains bytestring, whereas python3 json.loads expects a str thus you should decode first: data = request.body.decode('utf-8') received_json_data = json.loads(data)
But it said he tried request.body, how come it works for him now? I used request.body and it didn't work.
87

For python3 you have to decode body first:

received_json_data = json.loads(request.body.decode("utf-8"))

1 Comment

This is no longer the case, as of Python 3.6 JSON.loads() accepts bytes and auto detects the UTF variant used to encode.
1

HttpRequest is a file-like object so you can simplify from json.loads(request.body) slightly:

data = json.load(request)

Comments

-4

Create a form with data as field of type CharField or TextField and validate the passed data. Similar SO Question

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.