Django后端接收嵌套Json数据及解析详解
作者:三级狗 发布时间:2021-04-24 20:11:38
0、干货先写在前
1、前端传值的数据必须使用JSON.stringify()传化
2、后端,通过request.body接收数据,直接使用json.loads解析,解析前,先decode一下:receive_data = json.loads(request.body.decode())。如果使用simplejson.loads(request.body),就不用decode()
下面是这个问题产生及解决的过程,还有一些可能的应用场景。
1、传统方式解析表单数据
之前用Django后台接收数据的时候,一直采用的是表单的形式,通过Ajax传值的时候也是一样,直接通过键值对儿将值传递给后台,前端代码类似这样:
$.post("/login/",
{
"user":"threedog",
"password":"123456"
},
function (res) {
console.log(res)
});
在后台采用`request.POST`进行数据接收:
class Login(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
print(request.POST)
print("user :",end='')
print(request.POST.get('user',None))
print("password :",end='')
print(request.POST.get('password',None))
return HttpResponse('OK')
后台接收到的是一个QueryDict,打印如下:
可以看到这里的数据是按照Json的格式传递的,后台也完美地进行解析,但是,如果前端传递的数据为嵌套的Json,这种写法就开始出现问题!
2、解析嵌套的Json数据
前端代码修改如下:
$.post("/login/",
{
"user":{
'name':'threedog',
'age':18,
'sex':'男'
},
"password":"123456"
},
function (res) {
console.log(res)
});
这个时候后台收到的东西就有意思了:
password取值正常,但是user没能拿到值,而QueryDict的打印我们发现,原本是嵌套的字典,现在全部由两个键名合并成了新的键诸如:'user[sex]','user[age]'。这样的键到了后台是没办法按照普通字典或者json来进行解析的。
上网查,说是要使用request.raw_post_data代替request.POST就可以,然而很遗憾,报错再查之下发现,raw_post_data在Django1.4版本之后被取消,我使用的是Django1.11。再往下查,知道了要使用request.body,还要通过simplejson来解析。
但是request.body的解析仍然不顺利,前端不变,后台直接打印request.body的结果如下:
一个包含了键值对儿的二进制字符串,这个时候按网上的办法使用simplejson.loads()解析会报错:simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)。不用在这个上面纠结了,simplejson直接解析不了这个body。
后来灵感突发,发现前端在给出的数据原本就是JS中的object,并不是json的字符串,所以把前段的数据使用JSON.stringify()进行转换后,打印request.body以及通过simplejson.load()解析发现了令人惊喜的输出:
到了这一步就基本不用说啥了,完整接收了前端的json字符串并解析,这里如果不想安装第三方库simplejson的话,使用python自带的json模块也是可以解析的,只是在解析时需要将request.body进行一次decode()即可。完整代码如下
前端:
$.post("/login",
JSON.stringify({
"user":{
'name':'threedog',
'age':18,
'sex':'男'
},
"password":"123456"
}),
function (res) {
console.log(res)
});
后台:
class Login(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
print(request.body)
receive_data = simplejson.loads(request.body)
print(receive_data)
receive_data = json.loads(request.body.decode())
print(receive_data)
return HttpResponse('OK')
程序输出:
之前主要是因为写前端给数据的时候没有使用JSON.stringify()进行处理。导致后台无论什么方法解析都是一团糟。
3、简述应用场景
这个应用场景非常常见,除了我刚才提到的,前端给后台的,是嵌套的json数据的情况。还有微信小程序给后台数据,也需要JSON.stringify()处理给json,还有安卓,IOS app访问网站后台提交数据,都需要这种方式传值和解析。
来源:https://blog.csdn.net/Three_dog/article/details/81192923


猜你喜欢
- delete WeiBoTopics where Id in(select max(Id) from WeiBoTopics group b
- 在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块、get请
- Go pongo2 教程展示了如何使用 pongo2 模板引擎在 Golang 中使用模板。模板引擎是一个库,旨在将模板与数据结合起来以生成
- 在开发django项目时,启动开发服务器的命令为:python manager.py runserver [port]其中,[port]选项
- Python有许多强大的库用于爬虫,如beautifulsoup、requests等,本文将以网站https://www.xiurenji.
- 锁是指在某组资源中,两个或两个以上的线程在执行过程中,在争夺某一资源时而造成互相等待的现象,若无外力的作用下,它们都将无法推进下去,死时就可
- 一行拆分成多行1.根据某一列拆分效果:代码:if __name__ == '__main__':
- 本文实例讲述了Yii2中SqlDataProvider用法。分享给大家供大家参考,具体如下:第一种方法:$totalCount = Yii:
- 最近终于找到一个好的方法,使用Python的OpenCV模块识别滑动验证码的缺口,可以将滑动验证码中的缺口识别出来了。 测试使用如
- 今天在项目中,使用Mybatis对oracle数据库进行操作的时候,报出ORA-00911: invalid character的错误,检查
- 本文实例讲述了Python爬虫实现简单的爬取有道翻译功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#!p
- 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) <BR> 例
- 最近对H1的讨论很多(在文章内容页中),大致有以下两种情况:H1应该用于文章的标题上H1应该用于站点的标题上相信大多数人都偏向第一种方式:用
- 输入字母验证码,俺觉得特烦,特别还要输入大写字母。于是找到文件并修改成数字验证码。 修改文件 验证码文件位置 include\va
- 前言用过unittest的童鞋都知道,有两个前置方法,两个后置方法;分别是setup()setupClass()teardown()tear
- golang sort package: https://studygolang.com/articles/3360sort 操作的对象通常
- 在改进SQL Server 7.0系列所实现的安全机制的过程中,Microsoft建立了一种既灵活又强大的安全管理机制,它能够对用户访问SQ
- 这时候最好的做法就是按需引入,动态引入组件js和样式,文件load完成后调用callback,运行js。代码还是很简便的 1. 判断文件lo
- 目录一、使用方法二、输出结果1.id2.select_type3.table4.partitions5.type6.possible_key
- CSS处理斜角导航条的一个例子,这个是写着测试用的。暂没有实际的应用。斜角处理比较麻烦,主要有两个地方。1、图片处理。2、负数的理解。这两个