在执行meta.find_undeclared_variables

时间:2017-09-29 15:13:09

标签: jinja2

我正在使用jinja2.meta.find_undeclared_variables来查找模板中使用的变量。但是,当存在无法识别的过滤器时,TemplateAssertionError会失败。

有没有办法告诉jinja2忽略这些错误并只返回变量列表?

1 个答案:

答案 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)