
在 Flask 的 Jinja2 模板中,{% include %} 语句不支持嵌套 {{ }} 变量插值;正确方式是直接拼接字符串,例如 {% include "posts/" + post %},Jinja2 会自动解析变量并加载对应路径的模板文件。
在 flask/jinja2 模板中,`{% include %}` 语句不支持嵌套 `{{ }}` 变量插值;正确方式是直接拼接字符串,例如 `{% include "posts/" + post %}`,jinja2 会自动解析变量并加载对应路径的模板文件。
Jinja2 的 {% include %} 是一个模板指令(statement),而非表达式上下文,因此其中不能使用 {{ variable }} 插值语法。你尝试写的:
<code class="jinja2">{% include "posts/{{post}}" %}</code>
会被 Jinja2 视为字面量字符串 "posts/{{post}}",而非动态解析 post 变量——这正是问题中“实际跳转到 /post/{{post}}”的根本原因(注意:此处的“重定向”实为模板加载失败或路径误读,Jinja2 并不会发起 HTTP 重定向)。
✅ 正确做法是利用 Jinja2 的字符串拼接能力,在 {% include %} 内直接使用变量名参与运算:
<code class="jinja2">{% include "posts/" + post %}</code>
假设视图中传入 post = "5.html",则等效于:
<code class="jinja2">{% include "posts/5.html" %}</code>
若 post 是纯数字(如 5),推荐统一后缀以确保安全与可维护性:
<code class="jinja2">{% include "posts/" + post ~ ".html" %}</code>
?
~是 Jinja2 的字符串连接操作符(会自动将左右操作数转为字符串),比+更健壮(避免类型错误,如int + str报错)。
⚠️ 注意事项:
- 确保拼接后的路径指向真实存在的模板文件,否则 Jinja2 将抛出
TemplateNotFound异常; - 避免用户可控变量(如 URL 参数)直接用于
include,以防模板注入或路径遍历漏洞(如post = "../../etc/passwd")。生产环境应严格校验、白名单过滤或使用服务端预处理路径; - 推荐将动态包含逻辑封装在自定义宏或通过
render_template_string在视图层处理,提升安全性与可测试性。
总结:Jinja2 中动态 include 的核心原则是——在 {% %} 块内直接使用变量名拼接路径,禁用 {{ }};优先选用 ~ 进行安全字符串连接,并始终对变量来源保持警惕。











