我正在尝试从模板的渲染中构建依赖关系图,但在尝试从 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 %}
但不确定如何正确执行此操作。
通过使用自定义加载器,我可以获得这些值,但前提是它们之前没有被加载,因为环境缓存了加载的模板。(如果我禁用缓存,此解决方案可能会起作用,但它会对渲染性能产生重大影响。)
如何跟踪用于单个模板渲染的所有扩展/包含依赖项?