
在 flask 中使用 `render_template_string()` 时,直接拼接 python 的 `'\n'` 不会在 html 源码中生成可见换行,因为 jinja2 默认转义并忽略纯文本换行;需改用 `{{ '\n' }}` 让 jinja2 将其作为未转义的字符串插入。
Flask 默认使用 Jinja2 作为模板引擎,而 Jinja2 对模板中非变量/非表达式区域的原始字符串换行符(如 '\n')不作保留——尤其当它们出现在 Python 字符串拼接中(如 '
...
' + '\n')时,这些 \n 会被 Python 解析为普通字符,但最终传入 Jinja2 渲染器时,已失去上下文语义,且 HTML 本身对空白符(包括换行)默认“折叠显示”,导致浏览器源码查看时所有内容挤在一行。✅ 正确做法是:将换行符作为 Jinja2 表达式显式插入模板字符串中,利用 {{ '\n' }} 输出原生换行:
from flask import Flask, render_template_string
app = Flask(__name__)
@app.route('/')
def index():
text = "Hello, World!"
# ✅ 正确:换行符由 Jinja2 渲染,保留在 HTML 源码中
html = render_template_string('''
{{ text }}
{{ '\n' }}
{{ '\n' }}
''', text=text)
return html⚠️ 注意事项:
- {{ '\n' }} 中的单引号不可省略(否则 Jinja2 会将其识别为未定义变量);
- 若需多处换行,可复用 {{ '\n' }} 或封装为宏(如 {% macro nl() %}{{ '\n' }}{% endmacro %});
- 不要依赖 |safe 过滤器来“修复” '\n' 拼接——因为 \n 根本没进入 Jinja2 上下文,|safe 无作用;
- HTML 可读性优化仅影响开发者查看源码体验,不影响渲染效果;如需控制页面内换行显示,请用 CSS(如 white-space: pre-line)或
。
总结:Python 的 '\n' 是语言级换行,而 Flask/Jinja2 模板中的换行需通过模板语法显式声明。类比 PHP 的 PHP_EOL,Jinja2 中最直接的等效写法就是 {{ '\n' }}——它轻量、可靠,且完全兼容 Flask 的渲染流程。










