Django中经markdown转换的HTML内容如何在网页中正常渲染?
问题根源
Django模板默认开启了HTML自动转义机制,会把变量中的HTML标签转义为字符实体(比如把<p>转成<p>),所以你提前用markdown生成的HTML字符串不会被渲染,只会原样展示。
解决方法1:模板层加safe过滤器(最便捷)
直接在输出变量后追加|safe过滤器,告知Django该内容是安全的HTML,无需转义,修改你的chattr.html对应部分即可:
{% for chat_stream in chat %} <p> {% if not forloop.last %} <b>bot:</b> <br> {{chat_stream.ss|safe}} <br> <b>{{user}}:</b> <br> {{chat_stream.user|safe}} <br> {% endif %} </p> {% endfor %}
解决方法2:视图层标记为安全字符串
如果你希望从数据层面就标记内容无需转义,可以在视图中用mark_safe包裹生成的HTML:
首先导入依赖:
from django.utils.safestring import mark_safe
然后修改存储逻辑:
chatItem = ChatStream( ss= mark_safe(markdown.markdown(response)), user= mark_safe(markdown.markdown(message)), name=ip )
安全提示
关闭HTML转义会带来XSS跨站脚本攻击风险,建议提前对用户输入和模型返回的内容做标签过滤,仅保留<p>、<code>、<br>等你需要的安全标签,可借助bleach等库实现过滤。
内容的提问来源于stack exchange,提问作者Katie Melosto
相关产品推荐
相关产品推荐

