如何在 Django 1.6 中使用 HTTP POST 请求接收 json 数据?

Posted

技术标签:

【中文标题】如何在 Django 1.6 中使用 HTTP POST 请求接收 json 数据?【英文标题】:How to receive json data using HTTP POST request in Django 1.6? 【发布时间】:2014-07-26 22:35:45 【问题描述】:

我正在学习Django 1.6。 我想使用 HTTP POST 请求发布一些 JSON,并且我正在使用 Django 来完成这项学习任务。 我尝试使用request.POST['data']request.raw_post_datarequest.body,但没有一个对我有用。 我的views.py是

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')

我正在使用 requests 模块发布 JSON 数据。

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 应该打印该消息并发布数据,但我无法解决这个简单的问题。请告诉我如何在 Django 1.6 中收集发布的数据?

【问题讨论】:

Where's my JSON data in my incoming Django request?的可能重复 【参考方案1】:

对于python3,你必须先解码body:

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

【讨论】:

这不再是这种情况,从 Python 3.6 开始,JSON.loads() 接受 bytes 并自动检测用于编码的 UTF 变体。【参考方案2】:

您在这里混淆了表单编码和 JSON 数据。 request.POST['foo'] 用于表单编码数据。您发布的是原始 JSON,因此您应该使用 request.body

received_json_data=json.loads(request.body)

【讨论】:

request.body 包含字节串,而 python3 json.loads 需要一个 str 因此你应该首先解码:data = request.body.decode('utf-8') received_json_data = json.loads(data) 但上面说他试过request.body,怎么现在对他有用?我用request.body 没用。【参考方案3】:

创建一个表单,将数据作为CharFieldTextField 类型的字段,并验证传递的数据。 Similar SO Question

【讨论】:

以上是关于如何在 Django 1.6 中使用 HTTP POST 请求接收 json 数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 1.6 中使用另一个 url slug 从视图重定向到另一个 html 页面

Django 1.6:如何访问视图中的静态文件

Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

如何使用 Gunicorn 查看 Django 错误的详细信息?

Django 1.6 管理面板自定义

Django 1.6 - 以编程方式创建组和权限