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
猜你喜欢
- 思路整理:1、进入心灵鸡汤网页,使用python获取心灵鸡汤内容2、登陆微信,找到需要发送的朋友3、发送获取的内容1、获取心灵鸡汤的内容如下
- 之前的笔记里实现了softmax回归分类、简单的含有一个隐层的神经网络、卷积神经网络等等,但是这些代码在训练完成之后就直接退出了,并没有将训
- 一。存储过程的创建和使用1.创建程序包,并在程序中创建存储过程create or replace PACKAG
- PHP 中文工具类,支持汉字转拼音、拼音分词、简繁互转。PHP Chinese Tool class, support Chinese pi
- 前言在做项目中,网站前台或者后台有些数据需要在多个视图页面使用,例如用户基本信息数据,菜单展示数据。首先想到的是在每个控制器里传入这些需要的
- 1. 官方代码FUSE_MODULESTORCH.AO.QUANTIZATION.FUSE_MODULES的源代码2. fuse_modul
- 1、设置无头浏览器模式from selenium import webdriverfrom selenium.webdriver.chrom
- 从codered到nimda等,一大堆蠕虫把原来需要人工利用的漏洞都变成了程序自动利用了,大家还想去手工操作这些IIS漏洞么?让我们调整重心
- 前言密码是个很私密的东西它一直关联着一系列的机密事物,二战中密码起了很大的作用。在我们生活中尤其是现在我们手机上存在着许多的app是我们生活
- 推荐算法在互联网行业的应用非常广泛,今日头条、美团点评等都有个性化推荐,推荐算法抽象来讲,是一种对于内容满意度的拟合函数,涉及到用户特征和内
- Flask-WTF扩展可以把处理web表单的过程变成一种愉悦的体验。一、跨站请求伪造保护默认情况下,Flask-WTF能够保护所有表单免受跨
- 本文所依赖的环境为:进程和线程的概念进程概念我们想运行一个程序,首先会将该程序从存储介质上通过IO总线加载进内存中,而后再通过cpu进行调度
- 目录1. 选择合适的数据结构2. 善用强大的内置函数和第三方库3. 少用循环4. 避免循环重复计算5. 少用内存、少用全局变量总结官方原文,
- DataFrame的行和列:df[‘行’, ‘列’]Data
- JavaScript Length 字符长度函数,在很多时间我们会用length函数了,因为你得前台判断一个用户输入
- nginx简单配置php服务(多个)摘要:大部分网站开发语言都要运行在服务器,比如主流的nginx、apache等等,部署服务器环境对于大部
- 随着计算机硬件的不断发展,多核CPU已经成为普及的硬件设备,利用多核CPU的优势可以有效的提高程序的执行效率。而多进程模式可以实现多核CPU
- 删除重复记录,将TABLE_NAME中的不重复记录保存到#TABLE_NAME中select distinct&nbs
- 本文主要研究的是flask使用session保存登录状态及拦截未登录请求的相关内容,具体介绍如下。前端请求form:<form act
- 一、特效预览处理前处理后细节放大后二、程序原理1.将图片转为灰白图片后,将图片分成了三块,明、暗、阴影区域2.明区域使用空白进行填充3.阴影