Пометить строку как безопасную в Мако - PullRequest
11 голосов
/ 01 декабря 2009

Я использую Pylons с шаблонами Mako и хочу не вводить это постоянно:

${ h.some_function_that_outputs_html() | n }

Я хочу как-то пометить функцию или переменную как безопасную (вы можете сделать это в Django), чтобы мне не приходилось все время отправлять сообщения. Есть идеи?

Ответы [ 2 ]

10 голосов
/ 07 декабря 2009

Я только что узнал, что если вы добавите метод html в ваш класс, то Мако просто вызовет этот метод и выведет все, что он возвращает в шаблоне.

Так я и сделал:

def __html__(self):
    return unicode(self)

Это в основном то, что делает h.literal.

3 голосов
/ 01 декабря 2009

Согласно документам mako о фильтрации , вы можете установить фильтры по умолчанию, которые применяются внутри шаблонов при создании нового Template, а также TemplateLookup (в этом случае это будет применяться по умолчанию для всех шаблонов, которые он ищет), с аргументом default_filters.

Pylons использует этот аргумент вместе с TemplateLookup, чтобы установить значения по умолчанию для вашего проекта в файле config/environment.py:

# 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, например, если вы передадите h.literal('This will <b>not</b> be escaped') в шаблон, скажем, в качестве переменной с именем spam, вы можете просто использовать ${spam} без побега.

Если вы хотите получить тот же эффект при вызове определенной функции из шаблона, эта функция должна будет возвращать такой литерал или предоставлять помощник для той функции, которая вызывает h.literal для результата, если вы хотите оставить одна оригинальная функция. (или я думаю, вы также можете вызвать его через «Фильтрующее определение» (см. тот же документ Мако, что и выше), пока не экспериментировали с этим)

...