如何在 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_data
、request.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】:
创建一个表单,将数据作为CharField
或TextField
类型的字段,并验证传递的数据。 Similar SO Question
【讨论】:
以上是关于如何在 Django 1.6 中使用 HTTP POST 请求接收 json 数据?的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 1.6 中使用另一个 url slug 从视图重定向到另一个 html 页面
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)