About Me

Моя фотография
Дмитрий Жарий
dzhariy (at|собачка) gmail (dot|точка) com
Просмотреть весь профиль

Twitter Updates

    Subscribe To My Podcast

    02.04.2008

    Шаблонизатор Template toolkit теперь и в Python

    Еще в январе 2008 года вышел релиз порта шаблонизатора Template toolkit 2 для языка Python. Проект Template toolkit был запущен для Perl еще в середине бородатых 90-х. Вклад Template toolkit в развитие разработки веб-приложений на языке Perl – колоссален. Но, насколько полезным может быть TT2 при использовании в Python?


    Хм... а Mako то чем не угодил?
    К сожалению или к счастью, реализация TT2 для Python появилась сравнительно поздно. Потребность в мощном шаблонизаторе для таких языков, как Perl, Python и Ruby, в которых удобные средства генерации HTML не реализованных на языковом уровня, выражается особо остро, по сравнению, например, с PHP, который сам является мощным шаблонизатором. Такая потребность и повлекла за собой появление различных шаблонизаторов на любой вкус и цвет. Один шаблонный движок покрывает функциональность другого. Вся разница лишь в философии движка и его синтаксисе.
    TT2 практически не отличается от Mako или любого другого известного шаблонного движка по функциональности, но зато он здорово отличается в подходах создания шаблонов и их взаимодействия с основным кодом приложения.


    Синтаксический сахар и собственный язык для шаблонов
    TT2 использует свой простой язык для построения шаблонов. На этом языке можно описать практически все, что вам нужно не прибегая к использованию чистого Python в шаблонах. Но, между тем, Template toolkit поддерживает специальные блоки, в которых может быть использован код на чистом Питоне (PYTHON / RAWPYTHON).


    Новые языковые конструкции: UNLESS и SWITCH / CASE
    Конструкция UNLESS, подобна IF, только наоборот :). Блок unless выполняется, если условие ложно. Это наследство от языка Perl. Такая конструкция есть в Ruby. Просматривая буржуйский Перловый код, я не раз замечал, что эта конструкция используется очень часто. Мне же больше по душе старый добрый IF.
    Пример:
    [% name = 'Билл' %]
    [% surname = 'Гейтс' %]
    [% UNLESS name == 'Билл' && surname == 'Гейтс' %]
    Нам сказали таких не пущать! :(
    [% ELSE %]
    Захады, дарагой, гостэм будешь! :)
    [% END %]

    [% IF !(name == 'Билл' && surname == 'Гейтс') %]
    Нам сказали таких не пущать! :(
    [% ELSE %]
    Захады, дарагой, гостэм будешь! :)
    [% END %]

    Результат:
    Захады, дарагой, гостэм будешь! :)
    Захады, дарагой, гостэм будешь! :)


    А вот конструкция SWITCH / CASE будет полезной заменой цепочек if-elif-else и извращений с анонимными ассоциативными массивами.
    Пример:
    [% age = 16 %]
    [% SWITCH age %]
    [% CASE 0 %]
    Это шутка такая, да?
    [% CASE [1..17] %]
    А может лучше на футбол, чем на этом сайте сидеть?
    [% CASE [18, 19, 20, 21, 22, 23, 24 ] %]
    В двери стучат из военкомата...
    [% CASE DEFAULT %]
    Фух, хоть сейчас можно на сайте спокойно посидеть :)
    [% END %]

    Результат:
    А может лучше на футбол, чем на этом сайте сидеть?


    Template toolkit поддерживает и другие языковые конструкции и операторы, аналоги которых есть в Питоне:

    • FOREACH – аналог for. Поддерживается несколько форм записи.
    • WHILE – аналог обычного, старого доброго while.
    • IF / UNLESS / ELSIF / ELSE – ветвление
    • USE – это аналог import. Служит для загрузкигрузки плагинов, написанных на Python.
    • TRY / THROW / CATCH / FINAL – Обработка исключений непосредственно внутри шаблона.
    • NEXT, LAST – управление итерациями цикла. NEXT == continue; LAST ==break.
    • RETURN, STOP – Это остановка обработки только включаемого шаблона и полная остановка обработки всех шаблонов соответственно.

    Манипуляция блоками текста: фильтры, включения, блоки, обвертки и макросы
    Удобство при работе с блоками текста – это, на мой взгляд, самая необходимая функциональность, предоставляемая шаблонным движком. И у Template toolkit она развита на достаточно высоком уровне.

    Включения позволяют собирать шаблон страницы из частей, разбросанных по разным файлам либо вызывать именованные шаблоны. Template toolkit поддерживает 3 вида включения:
    INSERT – включить шаблон без обработки
    INCLUDE – включить и обработать шаблон. Все переменные включаемого файла или именованного шаблона будут находиться в локальном пространстве имен.
    PROCESS – аналог INCLUDE, при этом все переменные будут жить в глобальном пространстве имен “главного” шаблона.
    Кроме этого, PROCESS и INCLUDE используются для обработки текстовых блоков BLOCK.


    Обвертки и блоки
    BLOCK – это именованный шаблон, вызываемый с помощью директив PROCESS, INCLUDE, INSERT, WRAPPER. По принципу действия блок похож на функцию, которая возвращает текстовые данные. Блок можно вызывать как с параметрами, так и без, в любом месте обрабатываемого шаблона.
    Обвертки – это специальный вид блоков, один из параметров которого есть текст, который был заключен в директиву WRAPPER. Этот текст доступен через специальную переменную [% content %] внутри BLOCK. Сначала обрабатывается содержимое переменной [% content %], и лишь потом оно обрамляется в данные блока.
    К примеру, в блоке может быть реализована шапка и подвал страницы (т.е. ее макет; layout). А содержимое страницы может непосредственно попадать в готовый макет посредствам директивы WRAPPER.
    Пример:

    [% BLOCK layout %]
    Это шапка сайта
    Заголовок: [% title or 'Без имени' %]
    ---------------
    [% content %]
    ---------------
    А это подвал
    [% END %]

    [% WRAPPER layout title='My title' %]
    А тут содержимое страницы!
    [% END %]

    Результат:
    Это шапка сайта
    Заголовок: My title
    ---------------
    А тут содержимое страницы!
    ---------------
    А это подвал


    В отличие от блоков – макросы возвращают результаты вычислений, описанных непосредственно в шаблоне, это обычная функция. Для объявления макроса используется директива MACRO. Вызываются макросы по имени и могут участвовать в условиях и вычислениях.
    Директива FILTER по принципу действия подобна WRAPPER. Отличие состоит в том, что FILTER вызывает специальную функцию, написанную на Python для обработки куска текста, а не именованный шаблон, как это делает WRAPPER.
    Есть еще много того, о чем я не рассказал: о включение кода на Python внутри шаблона, о богатых возможностях конфигурирования шаблонного движка, о некоторых директивах... Все это вы можете узнать из руководств по Template toolkit’у, ссылки на которые я приведу в конце заметки.


    Так зачем же нужен еще один шаблонизатор?
    Template toolkit предоставляет свой подход при работе с шаблонами. Основная изюминка TT в том, что он использует свой, простой для изучения язык для составления шаблонов, который, при обработке движком, компилируется в Perl или Python. Так что вы не много потеряете в производительности, получая при этом удобство при программировании шаблонов. Хоть этот язык и прост для освоения, но при этом он поддерживает необходимые конструкции ветвления, циклы и управление временем выполнения шаблона, вызов методов переданных объектов и подключенных Питоновских модулей.
    Template toolkit будет очень удобен для программистов, которые после освоения Перла изучают Питон, так как теперь шаблонизатор можно использовать в обоих языках.
    Template toolkit – это мощь, скорость и гибкость в одном флаконе.

    Что почитать дальше?
    Конечно же, официальный ресурс Template toolkit 2 и не забыть зайти на страницу Template toolkit для Python – там есть ссылка на svn-репозиторий, откуда можно взять свежий релиз. Когда вам наскучат эти английские буковки – почитайте русскоязычную документацию. Информация о TT есть и в Wiki.
    Скачав TT с svn-репозитория – читайте документацию в файле template/ __init__.py.
    В папке t – вы обнаружите кучу тестов, а тесты, как известно – лучшая документация для программиста.

    Установка
    $ python setup.py install


    Приятного тэмплэйтинга!

    1 коммент.:

    worldmind комментирует...

    У них на сайте указана неверная команда для чекаута, надо так:
    svn co svn://svn.tt2.org/tt/Template-Python/trunk Template-Python

    Отправить комментарий

    Blog Archive

    Links

    Рейтинг блогов

    Участник планеты Developers.org.ua

    .NET ate my MOSK

    Mojo Perl MVC Web framework
    Mojo/Mojolicious -- Perl MVC веб фреймворк

    Моя старая домашняя страница