Тимофей Перевезенцев. Кухня современных python...
DESCRIPTION
Доклад на DevConf 2010TRANSCRIPT
Современные шаблонизаторыКакие они бывают и почему этого мало.
Перевезенцев Тимофей
май 18, 2010
Виды шаблонизаторов
Текстовые, использующие собственный синтаксис шаблоновI текстовые, которые работают с любым текстом и не имеют
понятия о семантике (jinja2, django, mako, chetah и др.)I с синтаксисом основанным на отступах (haml-подобные, daml,
ghrml)
Использующие обычные python объекты и собственный API (Stan,werkzeug и др.)DOM ориентированные (шаблон - (x)html документ, данныезаносятся с помощью DOM-подобных API из кода)
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 2 / 28
Текстовые шаблонизаторы, которые работают с любымтекстом и не имеют понятия о семантике
Мы к ним уже привыкли. Верстка пишется как есть, с вкраплениямиспециального синтаксиса шаблона.
мы можем верстать с ошибками (экранирование)мы можем получать невалидную версткупри внесении изменений в уже готовую верстку нужно быть оченьвнимательным
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 3 / 28
Текстовые шаблонизаторы с синтаксисом основанным наотступах
Явление довольно новое (свежее). Позволяют более тонко наблюдатьи контролировать структуру документа. Т.к. они владеют семантикой,могут быть более умными.
получается еще один язык разметки, который преобразуется вxml, а не текстна практике шаблоны могут быть совершенно непонятнымия не встречал шаблонизатор, который бы пользовался знаниемсемантики (это грустно)
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 4 / 28
Список требований, с учетом опыта использования
Управление потоком представленияВозможность повторного использованияКонтроль валидности (autoescape, правильная вложенность тегов)Области видимости данных шаблонаКачество диагностики ошибокВозможность использования в тексте символов специальных сточки зрения результатаБыстродействие (всех ли волнует быстродействие?)Тонкий контроль whitespace
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 6 / 28
Контроль валидности
Автоматическое экранирование выводимых в шаблон данныхдолжно быть включено по умолчаниюЧто бы указать, что данные представляют из себя валиднуюверстку надо каким-то образом пометить объект с данными
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 7 / 28
Контроль валидности
При этом надо учитывать, что существует несколько контекстов, вкоторых вставляются данные. А именно:
тэгатрибут
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 8 / 28
Возможность повторного использования
Есть несколько способов повторного применения шаблонов:макрос (включение, include)наследование шаблонов
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 9 / 28
Возможность повторного использования
При использовании наследования мы по сути объявляем базовыйшаблон, в котором описываем вызов методов и реализацию методов, ауже в дочернем шаблоне мы переопределяем реализацию методовбазового шаблона или наоборот реализуем.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 10 / 28
Возможность повторного использования
Какой же способ лучше?
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 11 / 28
Возможность повторного использования
Совмещение обеих методик - самый гибкий вариант.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 12 / 28
Область видимости данных шаблона
Все данные попадающие в шаблон - глобальные.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 13 / 28
Область видимости данных шаблона
Бывает удобно объявить переменную прямо в шаблоне. Если этологика представления. Если используется одна "вьюха"с разнымишаблонами и одни и те же данные надо представлять по разному.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 14 / 28
Область видимости данных шаблона
Давайте признаем, что термин "блок"( {% block content %} ) непригоден! Что это?
блок кодамакрос
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 15 / 28
Область видимости данных шаблона
{% block content %}{% set a = ’value’ %}{% block inner_block %}
{{ a }}{% endblock %}
{% endblock %}
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 16 / 28
Область видимости данных шаблона
Правильнее было бы называть - "метод"шаблона. И вызывать метод"как следует": {% self.content() %}
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 17 / 28
Область видимости данных шаблона
Появляется определенность в терминологииСтановится понятна ситуация с областью видимости
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 18 / 28
Область видимости данных шаблона
{% def inner_block(a) %}{{ a }}
{% enddef %}
{% def content() %}{% set a = ’value’ %}{{ self.inner_block(a) }}
{% enddef %}
{{ self.content() }}
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 19 / 28
Область видимости данных шаблона
Вспомагательные (контекстные) переменные в шаблоне - не самыйлучший выбор.
<ul>{% for item in items %}
<li {% if loop.first %}class="first"{% endif %}>{{ item.title }}
</li>{% endfor %}</ul>
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 20 / 28
Область видимости данных шаблона
<ul>{% for part in parts %}
<li {% if loop.first %}class="first"{% endif %}>{% for item in part %}
{{ loop ??? }}{% endfor %}</li>
{% endfor %}</ul>
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 21 / 28
Область видимости данных шаблона
Решение очень простое. (Tempita, Ян Бикинг)
<ul>{% for l1, part in looper(parts) %}
<li {% if l1.first %}class="first"{% endif %}>{% for l2, item in looper(part) %}
{{ l1.index }}{{ l2.index }}
{% endfor %}</li>
{% endfor %}</ul>
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 22 / 28
Качество диагностики ошибок
При возникновении исключений в шаблоне, строка шаблона свызовом повлекшим исключение должна отображаться в стекевызововШаблонизатор не должен маскировать исключения
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 23 / 28
Делаем свой шаблонизатор
Зачем? Развитие шаблонизаторов остановилось. Почти всепопулярные представители имеют одинаковый синтаксис и подход.При этом никто не хочет учитывать уже накопившийся опыт иэволюционировать.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 24 / 28
Делаем свой шаблонизатор
Для этого нам понадобятся
лексер (токенайзер)парсер
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 25 / 28
Делаем свой шаблонизатор
В информатике лексический анализ — процесс аналитическогоразбора входной последовательности символов (например, такой какисходный код на одном из языков программирования) с цельюполучения на выходе последовательности символов, называемых«токенами» (подобно группировке букв в словах). При этом, группасимволов входной последовательности, идентифицируемая на выходепроцесса как токен, называется лексема, то есть в процесселексического анализа производится распознавание и выделение лексемиз входной последовательности символов. wikipedia
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 26 / 28
Делаем свой шаблонизатор
В информатике, синтаксический анализ (парсинг) — это процесссопоставления линейной последовательности лексем (слов, токенов)языка с его формальной грамматикой. Результатом обычно являетсядерево разбора (синтаксическое дерево). wikipedia
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 27 / 28
Встречайте mint
http://github.com/riffm/mint/
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 28 / 28