2011-09-16 2 views
3

Я использую Pyramid и Mako для шаблонов.Функции Python в шаблонах Мако (не в модульных блоках)

Можно определить (полуанонимную) функцию в блоке Мако <% и %>.

Я знаю, что это может быть сделано с модульным блоком <%! и %>, но это означает, что моя функция не имеет доступа к локальной области при шаблонизации, то есть я должен передать каждый бит переменной в том, что я необходимость.

Пример:

...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={}) 

, а затем использовать его в своих функциях.

Примечание: Mako слишком быстро, потому что двигатель будет создать модуль питона для каждого * .MAK (файл шаблона), прежде чем сделать его, вы можете попробовать это:

from mako.template import Template 
mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules') 
print mytemplate.render() 

и проверить содержание *. py в файле '/ tmp/mako_modules'

0

пытались ли вы: locals()["header_name"] = ...