Вопрос

Я использую 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, что и выше), пока не экспериментировали с этим)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top