Отметьте строку как безопасную в Мако

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

${ h.some_function_that_outputs_html() | n }

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

Ответ 1

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

Итак, я сделал:

def __html__(self):
    return unicode(self)

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

Ответ 2

В соответствии с mako docs о фильтрации вы можете установить фильтры по умолчанию, которые применяются внутри шаблонов при создании нового Template as а также для 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'])

Вот почему вы получаете экранирование по умолчанию (это не тот случай, когда вы используете Mako самостоятельно). Таким образом, вы можете либо изменить его глобально в файле конфигурации, либо не полагаться на стандартный поиск. Помните, что вам следует, конечно, явно использовать фильтр, чтобы избежать тех вещей, которые требуют экранирования.

Вы также можете передать строку "помечено как безопасную" с помощью помощника Pylons h.literal, например, если вы пройдете h.literal('This will <b>not</b> be escaped') к шаблону, скажем, как переменную с именем spam, вы можете просто использовать ${spam} без каких-либо экранов.

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