Python Django 中安全序列化数据供前端 JSON 解析的完整实践

轻瑶吖_1356

轻瑶吖_1356

2026-04-28

798人浏览

原创

Python Django 中安全序列化数据供前端 JSON 解析的完整实践

本文详解如何在 Django 视图中正确将 Python 数据结构序列化为标准 JSON 字符串(而非 Python 字面量),避免因单引号导致 JSON.parse() 失败,并推荐两种生产级方案:json.dumps() 手动序列化与 Django 内置 |json_script 模板过滤器。

本文详解如何在 django 视图中正确将 python 数据结构序列化为标准 json 字符串(而非 python 字面量),避免因单引号导致 `json.parse()` 失败,并推荐两种生产级方案:`json.dumps()` 手动序列化与 django 内置 `|json_script` 模板过滤器。

在 Django 开发中,常需将后端查询的数据(如用户体重记录)传递给前端 JavaScript 进行可视化渲染(例如使用 Chart.js 绘制趋势图)。但若直接在模板中通过 {{ weight_data|safe }} 渲染 Python 列表字典,Django 会输出类似 [{'weight': '122.00', 'entry_date': '2023-09-28'}] 的字符串——这不是合法 JSON:JSON 标准强制要求键名和字符串值必须使用双引号("),而 Python 的 repr() 输出默认使用单引号('),导致前端调用 JSON.parse() 时抛出 SyntaxError。

✅ 正确方案一:视图层使用 json.dumps() 序列化

在视图中引入 Python 标准库 json,用 dumps() 显式生成符合 RFC 8259 的 JSON 字符串:

from json import dumps  # ✅ 关键导入

# ... 其他逻辑(分页、查询等)保持不变 ...

# 替换原 serialized_data 赋值语句:
serialized_data = dumps([
    {
        'weight': float(record.weight),  # 推荐保留数值类型,避免后续 parseFloat()
        'entry_date': record.entry_date.isoformat()  # 更健壮的日期格式(ISO 8601)
    }
    for record in user_weight_log
])

? 注意:dumps() 默认不转义 HTML 特殊字符。若数据含 , & 等,建议添加 separators=(',', ':') 减少空格,并确保模板中仍使用 |safe(因 JSON 字符串本身不含 HTML 标签,安全)。

模板中保持原写法:

<div id="weight-data" data-weight-data="{{ weight_data|safe }}"></div>

前端 JavaScript 可安全解析:

const weightDataElement = document.getElementById('weight-data');
const weightDataJSON = weightDataElement.getAttribute('data-weight-data');
const weightData = JSON.parse(weightDataJSON); // ✅ 成功!
console.log(weightData[0].weight); // number: 122

✅ 正确方案二:模板层使用 |json_script(推荐!)

Django 4.2+ 提供了更安全、更现代的解决方案:|json_script 过滤器。它自动序列化数据为 <script type="application/json"> 块,规避 XSS 风险且无需手动处理引号或转义。</script>

Li Python Sec Check
Li Python Sec Check

Python 安全规范检查工具:基于 CloudBase 规范、腾讯安全指南,LLM 智能分析(默认禁用,优先本地执行)

下载

视图中直接传入 Python 对象(无需 dumps):

# 视图中保持原始列表推导式(不调用 dumps)
weight_data = [
    {'weight': float(record.weight), 'entry_date': record.entry_date.isoformat()}
    for record in user_weight_log
]
return render(request, 'profile.html', {
    'user_weight_log': user_weight_log,
    'form': form,
    'weight_data': weight_data  # ✅ 传入原生 Python list/dict
})

模板中使用 |json_script:

<!-- 生成一个带 ID 的 script 标签 -->
{{ weight_data|json_script:"weight-data" }}

前端通过 JSON.parse() 读取:

// 自动查找 ID 为 "weight-data" 的 script 标签并解析其内容
const weightData = JSON.parse(document.getElementById('weight-data').textContent);
console.log(weightData.length); // ✅ 正确解析为数组

✅ 优势总结:

  • ✨ 自动 HTML 转义,杜绝 XSS(即使数据含恶意脚本也不会执行);
  • ? 语义化 <script type="application/json"> 符合规范; </script>
  • ? 无需在视图中导入 json,逻辑更清晰;
  • ? 支持任意嵌套结构(dict/list/tuple/None/bool/int/float),无需手动处理类型。

⚠️ 注意事项与最佳实践

  • 永远不要对未序列化的 Python 对象使用 |safe:{{ weight_data|safe }} 仅适用于已确认为合法 JSON 字符串的变量(如 dumps() 输出),否则存在安全风险。
  • 日期格式优先用 isoformat():比 strftime('%Y-%m-%d') 更通用,JavaScript new Date() 可直接解析。
  • 数值类型保持原生:用 float(record.weight) 而非 str(),避免前端重复 parseFloat()。
  • 分页数据需谨慎:当前示例中 user_weight_log 是 Page 对象,|json_script 会自动序列化其 object_list,但若需总页数等元信息,应额外构造字典传递。

通过以上任一方案,即可彻底解决单引号 JSON 解析错误,实现 Django 后端与前端 JavaScript 的安全、高效数据互通。

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

相关文章

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

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

下载

相关标签:

python js 前端 json django

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

相关专题

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

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

2023.08.11

2343

5

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

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

2023.10.09

5063

6

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

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

2024.03.19

6150

13

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

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

2024.03.22

5678

10

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

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

2024.05.22

803

5

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

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

2023.07.20

1691

4

python能做什么
python能做什么

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

2023.07.25

4244

7

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

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

2023.07.31

1669

3

python教程
python教程

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

2023.08.03

24617

23

热门下载

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

精品课程

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