【问题标题】:How to receive json data using HTTP POST request in Django 1.6?如何在 Django 1.6 中使用 HTTP POST 请求接收 json 数据?
【发布时间】: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 中收集发布的数据?

【问题讨论】:

标签: python django django-views http-post python-requests


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多