2

我正在尝试从模板的渲染中构建依赖关系图,但在尝试从 jinja 中获取好的信息时遇到了一些麻烦。

我希望能够呈现模板并取回用于呈现模板的所有文件的列表/集。例如:

# template.html
{% extend base.html %}
{% for partial in partials %}
    {% include partial %}
{% endfor %}

让它渲染并找出使用了哪些文件。

# deps.py
base_path = os.path.dirname(os.path.realpath(__file__))
jinja_env = jinja2.Environment(
    loader=jinja2.FileSystemLoader(base_path))

template = jinja_env.get_template('template.html')
template.render({
    "partials": [
        "test1.html",
        "test2.html",
    ],
})
# ???
looking_for = ['base.html', 'test1.html', 'test2.html']

我已经检查了AST树,meta.find_referenced_templates(ast)但它仅在使用包含路径的常量字符串时才有效。

尝试了一个查看令牌的自定义扩展,但这有同样的问题,我可以看到变量名称,但无法获取变量的值,因为它是在解析/编译阶段完成的。

还尝试覆盖{% include %}但不确定如何正确执行此操作。

通过使用自定义加载器,我可以获得这些值,但前提是它们之前没有被加载,因为环境缓存了加载的模板。(如果我禁用缓存,此解决方案可能会起作用,但它会对渲染性能产生重大影响。)

如何跟踪用于单个模板渲染的所有扩展/包含依赖项?

4

0 回答 0