Django项目中如何将Python生成的HTML传递到页面正常渲染
问题根因
你现在的代码有两个核心问题导致HTML无法正常渲染:
- 自定义的
HTMLFilter类仅重写了handle_data方法,该方法只会提取HTML标签包裹的纯文本内容,会直接丢弃所有<h1>、<p>、<a>等渲染必须的标签,这一步已经把HTML结构完全破坏了。 - Django模板引擎默认会对传入的字符串做HTML转义,即便传入了合法的HTML代码,直接用
{{ body }}输出时,标签会被转义为普通文本,不会被浏览器解析为页面元素。
修复步骤
1. 移除冗余的HTML解析逻辑
你使用的Markdown转HTML库输出的内容本身就是合法HTML,不需要再用HTMLParser做额外处理,直接删掉整个HTMLFilter类定义,以及调用html.feed(data)提取纯文本的相关代码即可。
2. 标记HTML内容为安全,避免模板转义
有两种等价的实现方式二选一即可:
方式一:在视图层标记安全字符串
导入Django自带的mark_safe方法,把转换完成的HTML内容标记为安全内容后再传给模板,修改后的视图代码如下:
from django.utils.safestring import mark_safe from markdown2 import Markdown def display_entry(request, entry): entry_content = util.get_entry(entry.capitalize()) if entry_content is not None: markdowner = Markdown() html_content = markdowner.convert(entry_content) return render(request, "encyclopedia/display.html", { "title": entry, "body": mark_safe(html_content) }) else: return render(request, "encyclopedia/error.html", { "entry": entry.capitalize() })
对应的模板不需要做修改,保持原有{{ body }}写法即可。
方式二:在模板层用安全过滤器
如果不想修改视图代码,可以直接在模板中给变量加safe过滤器,告诉模板引擎这段内容不需要转义,修改后的模板代码如下:
{% extends "encyclopedia/layout.html" %} {% block title %} {{ title }} {% endblock %} {% block body %} {{ body|safe }} {% endblock %}
注意:只有当Markdown内容完全来自可信来源(比如你自己编写的文档)时,才能使用
safe标记/过滤器。如果开放用户提交Markdown内容,直接渲染原始HTML会存在XSS注入风险,这种场景需要先使用标签白名单清洗工具过滤危险标签和属性后,再做安全标记。
效果验证
修改完成后,Markdown转换生成的标题、段落、链接等标签会被浏览器正常解析渲染,不会再出现只显示纯文本的问题。
内容的提问来源于stack exchange,提问作者Nqabenhle
相关产品推荐
相关产品推荐

