Тимофей Перевезенцев. Кухня современных python...

28
Современные шаблонизаторы Какие они бывают и почему этого мало. Перевезенцев Тимофей май 18, 2010

description

Доклад на DevConf 2010

Transcript of Тимофей Перевезенцев. Кухня современных python...

Page 1: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Современные шаблонизаторыКакие они бывают и почему этого мало.

Перевезенцев Тимофей

май 18, 2010

Page 2: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Виды шаблонизаторов

Текстовые, использующие собственный синтаксис шаблоновI текстовые, которые работают с любым текстом и не имеют

понятия о семантике (jinja2, django, mako, chetah и др.)I с синтаксисом основанным на отступах (haml-подобные, daml,

ghrml)

Использующие обычные python объекты и собственный API (Stan,werkzeug и др.)DOM ориентированные (шаблон - (x)html документ, данныезаносятся с помощью DOM-подобных API из кода)

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 2 / 28

Page 3: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Текстовые шаблонизаторы, которые работают с любымтекстом и не имеют понятия о семантике

Мы к ним уже привыкли. Верстка пишется как есть, с вкраплениямиспециального синтаксиса шаблона.

мы можем верстать с ошибками (экранирование)мы можем получать невалидную версткупри внесении изменений в уже готовую верстку нужно быть оченьвнимательным

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 3 / 28

Page 4: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Текстовые шаблонизаторы с синтаксисом основанным наотступах

Явление довольно новое (свежее). Позволяют более тонко наблюдатьи контролировать структуру документа. Т.к. они владеют семантикой,могут быть более умными.

получается еще один язык разметки, который преобразуется вxml, а не текстна практике шаблоны могут быть совершенно непонятнымия не встречал шаблонизатор, который бы пользовался знаниемсемантики (это грустно)

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 4 / 28

Page 5: Тимофей Перевезенцев. Кухня современных python шаблонизаторов
Page 6: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Список требований, с учетом опыта использования

Управление потоком представленияВозможность повторного использованияКонтроль валидности (autoescape, правильная вложенность тегов)Области видимости данных шаблонаКачество диагностики ошибокВозможность использования в тексте символов специальных сточки зрения результатаБыстродействие (всех ли волнует быстродействие?)Тонкий контроль whitespace

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 6 / 28

Page 7: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Контроль валидности

Автоматическое экранирование выводимых в шаблон данныхдолжно быть включено по умолчаниюЧто бы указать, что данные представляют из себя валиднуюверстку надо каким-то образом пометить объект с данными

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 7 / 28

Page 8: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Контроль валидности

При этом надо учитывать, что существует несколько контекстов, вкоторых вставляются данные. А именно:

тэгатрибут

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 8 / 28

Page 9: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Возможность повторного использования

Есть несколько способов повторного применения шаблонов:макрос (включение, include)наследование шаблонов

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 9 / 28

Page 10: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Возможность повторного использования

При использовании наследования мы по сути объявляем базовыйшаблон, в котором описываем вызов методов и реализацию методов, ауже в дочернем шаблоне мы переопределяем реализацию методовбазового шаблона или наоборот реализуем.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 10 / 28

Page 11: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Возможность повторного использования

Какой же способ лучше?

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 11 / 28

Page 12: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Возможность повторного использования

Совмещение обеих методик - самый гибкий вариант.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 12 / 28

Page 13: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

Все данные попадающие в шаблон - глобальные.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 13 / 28

Page 14: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

Бывает удобно объявить переменную прямо в шаблоне. Если этологика представления. Если используется одна "вьюха"с разнымишаблонами и одни и те же данные надо представлять по разному.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 14 / 28

Page 15: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

Давайте признаем, что термин "блок"( {% block content %} ) непригоден! Что это?

блок кодамакрос

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 15 / 28

Page 16: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

{% block content %}{% set a = ’value’ %}{% block inner_block %}

{{ a }}{% endblock %}

{% endblock %}

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 16 / 28

Page 17: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

Правильнее было бы называть - "метод"шаблона. И вызывать метод"как следует": {% self.content() %}

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 17 / 28

Page 18: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

Появляется определенность в терминологииСтановится понятна ситуация с областью видимости

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 18 / 28

Page 19: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

{% def inner_block(a) %}{{ a }}

{% enddef %}

{% def content() %}{% set a = ’value’ %}{{ self.inner_block(a) }}

{% enddef %}

{{ self.content() }}

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 19 / 28

Page 20: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

Вспомагательные (контекстные) переменные в шаблоне - не самыйлучший выбор.

<ul>{% for item in items %}

<li {% if loop.first %}class="first"{% endif %}>{{ item.title }}

</li>{% endfor %}</ul>

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 20 / 28

Page 21: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

<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

Page 22: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Область видимости данных шаблона

Решение очень простое. (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

Page 23: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Качество диагностики ошибок

При возникновении исключений в шаблоне, строка шаблона свызовом повлекшим исключение должна отображаться в стекевызововШаблонизатор не должен маскировать исключения

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 23 / 28

Page 24: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Делаем свой шаблонизатор

Зачем? Развитие шаблонизаторов остановилось. Почти всепопулярные представители имеют одинаковый синтаксис и подход.При этом никто не хочет учитывать уже накопившийся опыт иэволюционировать.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 24 / 28

Page 25: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Делаем свой шаблонизатор

Для этого нам понадобятся

лексер (токенайзер)парсер

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 25 / 28

Page 26: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Делаем свой шаблонизатор

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

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 26 / 28

Page 27: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Делаем свой шаблонизатор

В информатике, синтаксический анализ (парсинг) — это процесссопоставления линейной последовательности лексем (слов, токенов)языка с его формальной грамматикой. Результатом обычно являетсядерево разбора (синтаксическое дерево). wikipedia

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 27 / 28

Page 28: Тимофей Перевезенцев. Кухня современных python шаблонизаторов

Встречайте mint

http://github.com/riffm/mint/

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 28 / 28