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

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

Jan 19, 2015

Download

Technology

otkds

Доклад на DevConf 2010
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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