Django中如何将Python传入HTML的字符串变量渲染为可识别的HTML元素?
Django模板中HTML变量无法渲染为元素的解决方法
问题原因
Django模板默认开启了自动HTML转义机制,目的是防范XSS跨站脚本攻击,所有传入模板的字符串内容都会被自动转义为HTML实体字符,所以你生成的HTML标签会被直接当做纯文本展示。
解决方法
你有两种常用方案可以选择:
方案1:模板中添加safe过滤器
这是最简便的方案,直接修改模板中body变量的写法,添加safe过滤器告知Django该内容是安全的、不需要转义:
{% extends "mapper/layout.html" %} {% block title %} mapper {% endblock %} {% block body %} <h1>{{ title }}</h1> <div> {{ body|safe }} </div> {% endblock %}
该方案适合你确定body的内容是完全可控的场景,比如是你自己从Markdown转换生成、没有普通用户提交的不可信内容。
方案2:视图层用mark_safe标记内容
如果你不想在模板中额外加过滤器,也可以在views.py中处理好HTML内容后,用Django自带的mark_safe方法标记该内容为安全内容,后续模板直接使用{{ body }}即可:
# 先导入依赖 from django.utils.safestring import mark_safe # 你转换得到HTML字符串的逻辑 html_content = 你的markdown转HTML结果 # 标记为安全内容后再传入模板 return render(request, "你的模板路径", {"title": 你的标题, "body": mark_safe(html_content)})
安全提醒
两种方案都要求你确保要渲染的HTML内容是安全的,如果body内容包含普通用户提交的输入,不要直接使用上述方法,必须先对HTML内容做消毒处理,过滤掉<script>等危险标签,避免出现XSS安全漏洞。
内容的提问来源于stack exchange,提问作者Katie Melosto
相关产品推荐
相关产品推荐

