如何在 python 中为 jinja2 设置基本模板?

How to set a base template for jinja2 in python?

有了 jinja2,我可以在模板中使用 {% extends "base.html" %}。但是我想在 python 代码中设置一个默认的基本模板,像这样:

t=environment.get_template(filename)
t.render(base_template="base.html")

所以当所有模板(必须)使用相同的基本模板时,我不需要向每个模板添加 extends 行。

我写了一个自己的加载器:

class FileSystemLoaderWithBase(jinja2.FileSystemLoader):
    def __init__(self, *args, **kwargs):
        self.base_template = kwargs.pop("base_template", None)
        super(FileSystemLoaderWithBase, self).__init__(*args, **kwargs)

    def get_source(self, environment, template):
        (source, path, creation) = super(
            FileSystemLoaderWithBase, self).get_source(environment, template)
        if self.base_template and template != self.base_template:
            source = '{% extends "' + self.base_template + '" %}\n' + source
        return (source, path, creation)

它可以与基本模板名称一起使用:

l=FileSystemLoaderWithBase("mytemplatefolder", base_template="base.html")

可选地,您可以允许使用自己的 {% extends "..." %} 行加载模板,以使某些模板具有更复杂的继承

if self.base_template and template != self.base_template\
    and "{% extends" not in source:

这当然不是很稳健。例如,{%extends 关键字之间的空格数在 jinja2 模板中允许不同。