Пометить строку как безопасную в Мако
Вопрос
Я использую Pylons с шаблонами Mako и не хочу вводить это постоянно:
${ h.some_function_that_outputs_html() | n }
Я хочу как-то пометить функцию или переменную как безопасную (вы можете сделать это в Django), чтобы мне не приходилось все время отправлять по конвейеру. Есть идеи? Р>
Решение
Я только что узнал, что если вы добавите метод html в свой класс, то Мако просто вызовет этот метод и выведет все, что он возвращает в шаблоне.
Так я и сделал:
def __html__(self):
return unicode(self)
Это в основном то, что делает h.literal.
Другие советы
Согласно документам mako о фильтрации , вы можете установить фильтры по умолчанию, которые применяются внутри шаблонов при создании нового Template
, а также для TemplateLookup
(в этом случае это будет применяться по умолчанию для всех шаблонов, которые он ищет) с аргументом default_filters
.
Pylons использует этот аргумент с config/environment.py
, чтобы установить значения по умолчанию для вашего проекта в h.literal
файле:
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
Вот почему вы получаете экранирование по умолчанию (а это не тот случай, когда вы используете Мако самостоятельно). Таким образом, вы можете либо изменить его глобально в файле конфигурации, либо не полагаться на стандартный поиск. Имейте в виду, что вы, конечно, должны затем явно использовать фильтр, чтобы избежать тех вещей, которые действительно нужно экранировать.
Вы также можете передать строку " помеченную как безопасную " с помощью помощника Pylons h.literal('This will <b>not</b> be escaped')
, например, если вы передадите spam
в шаблон, скажем, как переменную с именем ${spam}
, вы можете просто использовать <=> без экранирования.
Если вы хотите получить тот же эффект при вызове определенной функции из шаблона, эта функция должна будет возвращать такой литерал или предоставлять помощник для той функции, которая вызывает <=> в результате, если вы хотите выйти одна оригинальная функция. (или, я думаю, вы могли бы также вызвать его через " Filter def <<>> (см. тот же документ Mako, что и выше), пока не экспериментировали с этим)