如何在Python的Django中优雅处理前端传递的复杂嵌套JSON数据

梦涛小哥_1522

梦涛小哥_1522

2026-11-10

811人浏览

原创

Django接收嵌套JSON需手动解析request.body并校验,推荐用DRF Serializer处理多层嵌套;解析前应限制深度防递归,保存时须拆解嵌套数据再分别创建模型实例。

如何在python的django中优雅处理前端传递的复杂嵌套json数据

接收嵌套JSON时request.body为空或报错

前端用 fetch 或 axios 发送 Content-Type: application/json 请求时,Django 默认不自动解析 request.body。直接读 request.POST 会是空的,因为 POST 只处理表单编码(application/x-www-form-urlencoded 或 multipart/form-data)。

正确做法是手动解析原始 body:

import json
<p>def my_view(request):
if request.method == 'POST':
try:
data = json.loads(request.body.decode('utf-8'))
except json.JSONDecodeError:
return JsonResponse({'error': 'Invalid JSON'}, status=400)</p>

注意点:

  • request.body 是 bytes,必须用 .decode('utf-8') 转成字符串再解析
  • 别用 request.POST.get('xxx')——它对 JSON 请求完全无效
  • 生产环境建议加 if not request.content_type == 'application/json' 做类型校验

用Django REST Framework的Serializer校验嵌套结构

手写 json.loads + 手动字段校验容易漏边界、难复用。DRF 的 Serializer 是更健壮的选择,尤其对多层嵌套(如 {'user': {'profile': {'tags': ['a','b']}}})。

示例:定义支持三级嵌套的序列化器

from rest_framework import serializers
<p>class TagSerializer(serializers.Serializer):
name = serializers.CharField(max_length=20)</p><p>class ProfileSerializer(serializers.Serializer):
nickname = serializers.CharField(required=False)
tags = TagSerializer(many=True, required=False)</p><p>class UserSerializer(serializers.Serializer):
email = serializers.EmailField()
profile = ProfileSerializer(required=False)</p>

在视图中使用:

serializer = UserSerializer(data=data)
if serializer.is_valid():
    validated_data = serializer.validated_data  # 已清洗、类型转换、嵌套展开
else:
    return Response(serializer.errors, status=400)

关键细节:

HISUI 前端框架开发指南(IRIS版)
HISUI 前端框架开发指南(IRIS版)

HISUI 前端框架基础开发指南。HISUI 是基于 easyui 二次开发的 jQuery UI 组件库,专为医疗信息系统设计。当涉及 HISUI 组件开发、jQuery easyui 表格/表单/布局/窗口、医疗系统前端页面编写时使用此 skill。 涵盖 40 个组件的官方文档参考,支持声明式与编程式两种初始化方式,提供 $cm/$m 数据访问方法。

下载
  • many=True 用于列表字段,否则嵌套数组会校验失败
  • 嵌套 Serializer 默认要求非空;加 required=False 才允许字段缺失
  • validated_data 是字典,不是模型实例——适合纯数据处理场景

避免递归嵌套导致的无限循环或性能崩塌

前端可能传入意外的深层嵌套(比如 10 层嵌套对象),或故意构造循环引用({"a": {"b": {...}}} 中 b 指回 a)。DRF 默认不检测循环,json.loads 会直接报 RecursionError 或卡死。

防御措施:

  • 在解析前限制嵌套深度:json.loads(request.body, parse_constant=lambda x: _raise_on_deep(x, max_depth=5))(需自定义钩子)
  • 更简单:用 json.loads 的 object_hook 统计层级,超限时抛异常
  • DRF 中可在 to_internal_value 方法里加深度检查,例如 len(str(data)) > 1024*100 快速拦截超大 payload
  • Nginx 层加 client_max_body_size 2m; 防止巨量 JSON 打满内存

保存嵌套数据到Django模型时的常见陷阱

拿到校验后的 validated_data 后,不能直接 User.objects.create(**validated_data)——因为 profile 是字典,不是 Profile 实例,Django 会报 Object of type dict is not JSON serializable 或字段不匹配。

正确拆解方式:

# 先 pop 出嵌套部分
profile_data = validated_data.pop('profile', None)
user = User.objects.create(**validated_data)
<p>if profile_data:
Profile.objects.create(user=user, **profile_data)</p>

注意点:

  • 用 .pop() 而非 .get(),避免把嵌套 dict 当作字段传给 create()
  • 外键关联(如 user=user)必须显式传入,不能靠字段名自动推导
  • 如果嵌套中含多对一关系(如多个 Tag),需循环创建并关联,不能用 ** 解包

嵌套层级越深,手动拆解越容易出错;复杂业务建议封装成 save_nested() 工具函数,但别过度抽象——多数项目两层嵌套已足够。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python js 前端 json django

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2923

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6403

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7290

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

7138

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

1023

5

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1891

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5264

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1849

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

31817

23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程