2009-12-01 2 views
11

Я использую пилоны с шаблонами Мако, и я хочу, чтобы не вводить это все время:Марк струна как сейф в Мако

${ h.some_function_that_outputs_html() | n } 

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

ответ

10

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

Так что я сделал:

def __html__(self): 
    return unicode(self) 

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

+0

Это должно войти в «класс», который возвращается 'h.some_function_that_outputs_html()' Я предполагаю. – Felix

3

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

Пилоны используют этот аргумент с 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']) 

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

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

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

+0

Спасибо, это сработало для меня – disc0dancer

+0

Просто уведомление для людей, использующих первое решение (удаление escape из default_filters) - вам нужно очистить кеш (rm -r data/templates/*), чтобы увидеть его работу (я просто потратил некоторые интересно, что не так). – zefciu