如何在 Jinja2 中包含具有相对路径的模板

Posted

技术标签:

【中文标题】如何在 Jinja2 中包含具有相对路径的模板【英文标题】:How to include a template with relative path in Jinja2 【发布时间】:2012-01-20 17:04:21 【问题描述】:

我正在尝试在模板中包含同一文件夹中的另一个模板。为此,我只是在做% import 'header.jinja2' %。问题是我不断收到TemplateNotFound 错误。

我的模板文件夹看起来像

+ myProject
|
+--+ templates
   |
   +--+ arby
   |  |-- header.jinja2
   |  |-- footer.jinja2
   |  +-- base.jinja2
   |
   +--+ bico
      |-- header.jinja2
      |-- footer.jinja2
      +-- base.jinja2

因此,当我渲染 arby 的“base.jinja2”时,我想包含“arby/header.jinja2”,而当我渲染 bico 的“base.jinja2”时,我想包含“bico/header.jinja2”。问题是我不想在 % include 'arby/base.jinja2' % 中写 'arby/' 或 'bico/' 前缀。这可能吗?

谢谢

【问题讨论】:

你从哪个文件运行import 来自“arby/base.jinja2”。我想使用 %import 'header.jinja2'% 来包含 'arby/header.jinja2' 【参考方案1】:

jinja2.Environment.join_path() 文档字符串中有关于子类化 Environment 和覆盖 join_path() 方法以支持 import 相对于当前(即 join_path 的 parent 参数)模板的路径的提示.

这是一个此类的示例:

class RelEnvironment(jinja2.Environment):
    """Override join_path() to enable relative template paths."""
    def join_path(self, template, parent):
        return os.path.join(os.path.dirname(parent), template)

【讨论】:

小心 - 由于 Jinja 问题 411 和 412,这在 Windows 上不起作用 - os.path.dirname 和 os.path.join 将使用 '\\',FilesystemLoader 将拒绝。确保结果用'/' 分隔,而不是os.path.sep @TomaszGandor 你是对的。在过去的几个小时里,我一直因此而挣扎。这必须放在一些文档中【参考方案2】:

这个答案来晚了,但是对于任何有这个问题的人,你可以在 base.jinja2 中这样做

%import 'arby/header.jinja2' as header%

jinja 应该知道模板的路径,因此在模板的子文件夹中指定文件应该像文件夹/file.extension 一样简单。

注意:来自flask pespective

【讨论】:

以上是关于如何在 Jinja2 中包含具有相对路径的模板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jinja2 模板中包含 HTML 文件?

如何连接相对路径或生成嵌套文件夹中包含的唯一标识符 svg?

基于固定相对路径在 zip 文件中包含目录结构

Visual Studio 2010 发布具有相对路径的配置文件目标位置

vs2010 相对路径中附加包含目录 不好用,请帮忙看看

如何在模块中包含 *.py 以外的文件?