在 Django 模板中生成 JSON 的陷阱

Posted

技术标签:

【中文标题】在 Django 模板中生成 JSON 的陷阱【英文标题】:Pitfalls of generating JSON in Django templates 【发布时间】:2011-03-18 01:17:33 【问题描述】:

我发现自己对 Django 呈现 JSON 数据的能力不满意。如果我使用内置序列化,则数据库外键关系不包含在数据中(仅键)。此外,似乎不可能在 json 提要中包含不属于被序列化模型的自定义数据。

作为测试,我实现了一个模板,该模板为特定模型的结果集呈现了一些 JSON。我能够包含/排除我想要的模型的任何部分,并且还能够包含自定义数据。

测试似乎运行良好,并不比推荐的序列化方法慢。

使用这种序列化方法有什么陷阱吗?

【问题讨论】:

【参考方案1】:

到目前为止,从模板生成 JSON,我们遇到了转义换行符的需要。接下来看看做 simplejson.dumps()。

【讨论】:

【参考方案2】:

我不明白您为什么将选择视为“使用 Django 序列化程序”或“在模板中编写 JSON”。中间方法,在我看来更加健壮并且非常适合您的用例,是将您的数据构建为 Python 列表/字典,然后简单地使用 simplejson.dumps() 将其转换为 JSON 字符串。

【讨论】:

【参考方案3】:

我们使用此方法获取datatables.net 使用的自定义 JSON 格式 这是我们找到的完成这项任务的最简单的方法,而且目前看起来非常好,没有任何问题。

您可以在这里找到详细信息:http://datatables.net/development/server-side/django

【讨论】:

【参考方案4】:

一个问题可能是转义像“这样的元字符。Django 的模板系统会自动转义危险字符,但它设置为对 html 执行此操作。您应该准确查找模板转义的作用,并将其与 JSON 中的危险字符进行比较。否则,可能会导致 XSS 问题。

您可以考虑构建字典和列表的数据结构,然后在其上运行 JSON 序列化程序,而不是直接在您的数据库模型上。

【讨论】:

【参考方案5】:

虽然很难确定这种方法是否有任何缺陷,但它是我们在生产中使用的方法,因为您可以控制所有序列化的内容,即使底层模型发生了变化。近两年来,我们一直在使用这种方法运行一个高流量的应用程序。

希望这会有所帮助。

【讨论】:

您是如何解决上述“转义”问题的? 我们没有遇到任何转义问题。我知道我们的数据中一直都有特殊字符,这一定意味着任何消耗数据的东西都会对它们进行转义。

以上是关于在 Django 模板中生成 JSON 的陷阱的主要内容,如果未能解决你的问题,请参考以下文章

在视图而不是模板中生成带有 Django 静态 url 的图像标签

如何在 Django 模板中生成换行符

Go 使用json时的陷阱

如何在 django 中生成 url

Servlet中生成json文件,echarts模板调用

高性能SQL——数据库设计使用陷阱