Django中安全输出HTML内容的两种方法

咖啡半糖
咖啡半糖
发布时间:2026-10-13| 6人浏览过
原创

本文介绍在Django框架中直接输出HTML字符串的两种解决方案。针对单个变量,推荐使用safe过滤器关闭自动转义;针对模板片段,可使用autoescape标签控制转义范围。文章同时解析Django默认进行HTML转义以防范XSS攻击的安全机制,帮助开发者在功能需求与安全性之间取得平衡。

近期在研究Django框架时,笔者尝试构建一个简易网站作为练习项目。该项目的核心功能是从网络抓取数据并展示在网站上。然而,在开发过程中遇到了一个典型问题:Django默认不直接输出HTML格式内容,而是将其作为纯字符串处理。

data = '<h1>hello world</h1>'
<p>{{ data }}</p>

我们的预期目标是让浏览器解析并渲染HTML标签,例如:<p>[[t1]]</p><div class="jb51code"><div data-wp-asset="a0"></div></div>

hello world

但实际运行结果却是将HTML标签作为普通文本显示在页面上,即:<p>[[t2]]</p><div class="jb51code"><div data-wp-asset="a1"></div></div>

<h1>hello world</h1>

经过多方搜索与测试,最终找到了解决这一问题的有效方法。

如果只需处理单个变量,可以利用Django提供的safe过滤器。该过滤器指示Django不要对该字符串执行HTML转义操作,具体用法如下:<p>[[t4]]</p><div class="jb51code"><div data-wp-asset="a3"></div></div>

data | safe

若需对一段模板内容进行控制,可以使用autoescape标签。示例代码如下:<p>[[t5]]</p><div class="jb51code"><div data-wp-asset="a4"></div></div>

{% autoescape off %}
 {{ data }}
{% endautoescape %}

其中,off参数表示关闭HTML转义功能;若将其替换为on,则表示开启HTML转义。需要注意的是,Django默认行为是进行HTML转义。

需要特别注意的是,autoescape属性具有继承性。如果在父模板中定义了该属性,子模板对应内容区域也将继承此设置。

读者可能会疑惑,Django为何要将字符进行转义,而不是直接输出原始的HTML内容?

让我们通过一个具体场景来说明:<p>[[t9]]</p>

假设在用户注册环节,需要输入用户名。有用户输入了包含脚本标签的用户名:<p>[[t10]]</p><div class="jb51code"><div data-wp-asset="a5"></div></div>

<script type="text/javascript">alert('hello');</script>

假设该输入长度符合规范,且Django未提供特殊的字符转换方法。如果直接输出上述内容,每次访问该页面时浏览器都会执行脚本并弹出警告窗口。这显然存在严重的安全隐患。<p>[[t11]]</p>

为了解决此类安全风险,Django默认将所有特殊字符转换为HTML中可安全显示的实体字符,从而禁用自动转义功能。这也正是前文所述无法直接输出HTML内容的原因所在。<p>[[t12]]</p>

以上关于Django输出HTML内容的实例分享完毕,希望能为读者提供参考。欢迎大家继续支持本站。<p>[[t13]]</p>

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。