2011-09-16 126 views
3

我使用Pyramid和Mako進行模板化。Mako模板中的Python函數(不在模塊級塊中)

可以在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)} 

這工作代碼,但是當有比對功能的幾個變量更多,它得到相當unweildy。我還必須在模塊級別塊中重新導入可用於我的模板的任何「幫助器」功能。

有沒有辦法解決這個問題,還是我在做一些完全愚蠢的事情?

回答

3

添加字典在您的環境中使用:

template.render(local_vars={}) 

,然後在你的函數中使用它。

注:真子太快,因爲發動機將爲每個* .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文件

0

做了嘗試:locals()["header_name"] = ...