Mako 模板中的 Python 函数(非模块级块)
我正在使用Pyramid和Mako来处理模板。
在Mako的代码块中,你可以定义一个(半匿名的)函数,这个代码块是用<%
和%>
包裹起来的。
我知道可以用模块级别的代码块<%!
和%>
来实现这个功能,但这样做的话,我的函数就无法访问模板中的局部变量,这意味着我必须把需要的每一个变量都传递进去。
举个例子:
...template...
<%
variable_in_local_scope = 'blah blah blah'
def my_function():
header_name = variable_in_local_scope.upper()
return header_name
%>
${foo()}
这样做会抛出一个NameError
错误,提示header_name
没有定义。解决这个问题的唯一办法就是像这样写:
<%!
def my_function(input_variable):
return input_variable.upper()
%>
${my_function(variable_in_local_scope)}
这样可以工作,但如果函数需要的变量超过几个,就会变得很麻烦。而且我还必须在模块级别的代码块中重新导入任何可用的“辅助”函数。
有没有什么办法可以解决这个问题,还是我在做一些完全愚蠢的事情?
2 个回答
0
你试过这样写吗:locals()["header_name"] = ...
3
在你的环境中添加一个字典,可以使用:
template.render(local_vars={})
然后在你的函数中使用这个字典。
注意:Mako的速度很快,因为这个引擎会在渲染每个*.mak(模板文件)之前,为它创建一个Python模块。你可以试试这个:
from mako.template import Template
mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules')
print mytemplate.render()
然后查看'/tmp/mako_modules'文件夹中的*.py文件内容。