我正在使用jinja2.meta.find_undeclared_variables
来查找模板中使用的变量。但是,当存在无法识别的过滤器时,TemplateAssertionError
会失败。
有没有办法告诉jinja2忽略这些错误并只返回变量列表?
答案 0 :(得分:0)
我最后编写了一个小的解决方法来查找解析后的模板对象中的所有Name节点 - 下面是python 2代码,它给出了与meta.find_undeclared_variables类似的结果
def find_variables_in_document(body_list):
variables = set()
for body in body_list:
variables.update(set(find_variables(body)))
return sorted(variables)
def find_variables(obj):
if hasattr(obj, '__dict__'):
if type(obj) is jinja2.nodes.Name:
yield obj.name
else:
for attribute, value in vars(obj).iteritems():
if isinstance(value, jinja2.nodes.Node):
for _ in find_variables(value):
yield _
if type(value) == list:
for item in value:
for _ in find_variables(item):
yield _
然后可以这样使用:
from jinja2 import Environment
env = Environment()
ast = env.parse(your_template_string)
print find_variables_in_document(ast.body)