You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:09:18