django 接收 post 请求中的 json 数据

环境信息

  • Python3.10
  • Django 4.0

接收 post 中的 json 数据

示例通过 curl 命令模拟 post 请求,命令如下:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST \
-d '{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}' 127.0.0.1:8000/csapi

Django 处理程序示例:

views.py
from django.http import HttpResponse


def csapi(request):
post_body = request.body
print(f'****** POST body: {post_body}, type : {type(post_body)}')

#
data = eval(post_body)

print(f'****** data : {data} , type : {type(data)}')

return HttpResponse('ok')

Console 输出结果:

****** POST body: b'{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}', type : <class 'bytes'>
****** data : {'id': 'yTP7PSsRxz53tJ56VVG', 'type': 5} , type : <class 'dict'>

以上输出可以看到,request.body 中的类型为 bytes

使用 eval 转换后类型变为 dict

使用 json.loadsrequest.body 转换为 dict 时,可能会报以下错误:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

可能原因 参考