Mako模板变量名称

时间:2014-05-09 21:14:24

标签: python templates mako

在渲染之前是否可以在Mako模板中获取变量的名称?

from mako.template import Template
bar = Template("${foo}")

# something like:
# >> print bar.fields()
# ['foo']

用例:

我们有配置文件,我们指定数据库中的元数据以显示在网页上。客户端可以选择几百个不同的命名元数据中的一个。客户端可以配置N个插槽,但我们事先并不知道特定客户端希望在表单上填写哪些元数据。因为如果在渲染表单时我们需要提前知道我们需要为此客户端模板传递哪些变量名称。

我们曾想过拥有一个包含所有可能值的字典并且每次都传递它,但是由于新的可用字段经常被添加到客户端可以选择的基础可用元数据池中,所以它是不可行的。

因此我们希望使用Mako来模拟配置文件,但是我无法弄清楚如何使用模板中的字段值来确定我是否可以构建一个完整的Context来传递到模板。

2 个答案:

答案 0 :(得分:4)

不幸的是,没有简单的方法可以从模板对象中获取变量的名称。

幸运的是,有mako.codegen._Identifiers类,其对象的唯一目的是在编译过程中跟踪变量。

不幸的是,它深埋在Mako API表面下方,在编译完成后它就消失了。

幸运的是,你可以在没有设置Mako在编译模板时设置的所有内容的情况下获得它。您只需使用mako.lexer.Lexer即可获得解析树

无论如何这里是代码:

from mako import lexer, codegen


lexer = lexer.Lexer("${foo}", '')
node = lexer.parse()
# ^ The node is the root element for the parse tree.
# The tree contains all the data from a template
# needed for the code generation process

# Dummy compiler. _Identifiers class requires one
# but only interested in the reserved_names field
compiler = lambda: None         
compiler.reserved_names = set() 

identifiers = codegen._Identifiers(compiler, node)
# All template variables can be found found using this
# object but you are probably interested in the
# undeclared variables:
# >>> print identifiers.undeclared
# set(['foo'])

答案 1 :(得分:0)

追逐Mako变量并不好玩。我把这个小函数拼凑起来从模板中提取变量 - 使用&随心所欲地改善。

{{1}}

FWIW,makovars是有序的,vars是独特的但不是有序的。