在Flask应用开发中,HTML文本不显示是开发者经常遇到的渲染问题,这类问题通常和模板渲染规则、内容结构规范程度直接相关,需要从Flask自带的Jinja2模板引擎的工作机制入手排查。

常见HTML文本不显示的原因
Flask默认使用Jinja2作为模板引擎,出于安全考虑,Jinja2会对模板中传入的变量默认进行HTML转义,这是导致HTML文本不显示的最常见原因。除此之外,还有几种常见的触发场景:
- 模板中未正确使用
safe过滤器,导致HTML标签被转义为纯文本展示 - 视图函数返回的内容结构不规范,未将数据正确传递到模板
- 模板文件存放路径不符合Flask的默认规范,导致模板未被正确加载
- 静态资源引用路径错误,导致关联的HTML样式或脚本未生效
规范化内容结构的解决方案
1. 正确使用safe过滤器解除转义
如果需要在模板中渲染包含HTML标签的变量,需要在变量后添加|safe过滤器,告知Jinja2不需要对该变量进行转义处理。
首先看视图函数的规范写法,需要明确返回模板和数据:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
# 包含HTML标签的内容,正常传递到模板
html_content = '<p style="color: red;">这是一段红色的HTML文本</p>'
return render_template('index.html', content=html_content)
if __name__ == '__main__':
app.run(debug=True)
对应的模板文件index.html需要放在项目的templates目录下,内容如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Flask HTML文本显示测试</title>
</head>
<body>
<h3>HTML内容展示区域:</h3>
<!-- 使用safe过滤器渲染HTML内容 -->
{{ content|safe }}
</body>
</html>
2. 统一模板和静态资源的结构规范
Flask对项目的目录结构有默认要求,规范化目录可以避免很多渲染问题:
| 目录名称 | 存放内容 | 规范说明 |
|---|---|---|
| templates | 所有Jinja2模板文件 | 必须和主应用文件同级,或者放在应用包内的templates目录 |
| static | CSS、JS、图片等静态资源 | 静态资源引用时使用url_for('static', filename='文件路径')生成路径 |
静态资源引用的规范示例:
<!-- 正确引用static目录下的css文件 -->
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
3. 全局关闭转义的风险提示
虽然可以通过autoescape配置全局关闭转义,但不建议在生产环境使用,会带来XSS安全风险。如果确实需要全局处理,可以在模板开头添加配置:
{% autoescape false %}
<!-- 该标签内的所有变量都不会自动转义 -->
{{ content }}
{% endautoescape %}
问题排查步骤总结
遇到HTML文本不显示的问题时,可以按照以下步骤排查:
- 检查视图函数是否正确将数据传递到模板,变量名是否和模板中一致
- 确认模板中是否对HTML内容变量使用了
|safe过滤器 - 检查模板文件是否放在正确的
templates目录下 - 查看浏览器控制台是否有静态资源加载错误,排查路径问题
按照上述规范调整内容结构后,Flask应用中的HTML文本就能正常渲染展示,同时避免不必要的安全风险。
FlaskHTML文本显示Jinja2模板内容结构规范化escape过滤修改时间:2026-07-02 11:18:31