【问题标题】:Jinja2 find_undeclared_variables ignores globals?Jinja2 find_undeclared_variables 忽略全局变量?
【发布时间】:2015-06-10 14:34:28
【问题描述】:

我想找出 Jinja2 模板的哪些变量没有被全局变量覆盖。我加载模板源,解析它并将结果输入meta.find_undeclared_variables。无论环境的全局字典中有什么内容,我都会得到模板的完整变量列表。如何使此操作识别环境和模板中的全局变量,并仅返回它们未涵盖的变量列表。

下面的示例创建一个环境,呈现模板以显示确实读取了全局变量并调用meta.find_undeclared_variables 以显示其结果。

from jinja2 import Environment, meta, FunctionLoader, PrefixLoader

def load_mapping(name):
    return 'Mapping %s {{version}} {{docid}}' % name

def load_link(name):
    return 'Link %s {{version}} {{docid}}' % name

loader = PrefixLoader({
    'link': FunctionLoader(load_link),
    'map':  FunctionLoader(load_mapping)
})

env = Environment(loader=loader)

globals = {'version': '1.0'}
env.globals.update(globals)

print env.get_template('map/test').render(docid='asdf')

tsrc = env.loader.get_source(env, 'link/test')
parsed = env.parse(tsrc)
print meta.find_undeclared_variables(parsed)

代码打印:

Mapping test 1.0 asdf
set(['version', 'docid'])

version 是一个全局变量,我想更改我的代码,以便只返回 docid。

我使用 Python 2.7.6 和 Jinja 2.7.3。

【问题讨论】:

    标签: python jinja2


    【解决方案1】:
    jinja_globals = env.globals.keys()
    print meta.find_undeclared_variables(parsed) - set(jinja_globals) 
    

    【讨论】:

    • 我最终做了类似的事情,但考虑到它只是一种解决方法。我一直在寻找 Jinja 的解决方案。在库之外进行操作意味着了解其内部结构并最终可能会崩溃。
    • 未声明的变量是您必须使用模板上下文或全局变量提供的所有变量。当您使用 {% set .. %} 时,您可以在模板中声明一个变量。井文档高级 API 中的更多信息:jinja.pocoo.org/docs/dev/apiclass jinja2.Environment
    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2017-11-09
    • 2017-03-29
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多