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