Flask/Jinja2:如何用相对路径引用当前模板同级文件?
在Flask Jinja2中实现相对路径引用模板的方法
哈哈,这个问题我之前也碰到过!Jinja2默认确实不支持直接用./tab.html这种相对路径来include模板,因为它的模板查找逻辑是基于你设置的模板根目录(比如Flask初始化时指定的template_folder),所以你写的./tab.html会被当成根目录下的文件,自然找不到同级的那个tab.html,才会触发TemplateNotFound异常。
不过有几个靠谱的解决办法,帮你实现相对路径引用:
方法一:启用Jinja2的relative_include扩展(推荐)
这是最简单直接的方式,Jinja2本身自带了这个扩展,只需要在Flask应用里开启它就行:
- 在你的Flask应用初始化代码中添加:
from flask import Flask app = Flask(__name__) # 启用相对引用扩展 app.jinja_env.add_extension('jinja2.ext.relative_include')
- 然后在同级模板里,就可以用相对路径引用了,记得加上
relative=True参数:
{% include './tab.html' relative=True %}
这样就能准确找到当前模板所在目录下的tab.html文件了。
方法二:手动拼接当前模板路径(无扩展方案)
如果你不想启用扩展,也可以通过Jinja2内置的变量来获取当前模板的路径,手动拼接出目标模板的位置:
{# 获取当前模板所在的目录路径 #} {% set current_template_dir = _template.name.split('/')[:-1]|join('/') %} {# 引用同级的tab.html #} {% include current_template_dir + '/tab.html' %}
这里的_template.name会返回当前模板的完整路径(比如user/project/task/task_detail/current.html),通过拆分、截取、拼接,就能得到当前模板所在的目录,再加上目标文件名就能实现相对引用。不过这个方法相对繁琐,不如扩展方案简洁。
额外提示
如果你的模板结构比较固定,也可以考虑把常用的子模板放在特定的子目录下,用更短的绝对路径引用(比如{% include 'task_detail/tab.html' %}),但这就不是严格意义上的相对路径了,适合模板结构稳定的场景。
内容的提问来源于stack exchange,提问作者Mojimi
相关产品推荐
相关产品推荐

