Функции Python в шаблонах Mako (не в блоках уровня модуля) - PullRequest
4 голосов
/ 16 сентября 2011

Я использую пирамиду и Мако для шаблонов.

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

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

Пример:

...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 ]

3 голосов
/ 17 сентября 2011

Добавьте словарь в вашем контексте, используя:

template.render(local_vars={})

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

Примечание: Mako слишком быстр, потому что движок создаст модуль python для каждого * .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 голосов
/ 16 сентября 2011

вы пробовали: locals()["header_name"] = ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...