····{% endblock %}
</div>
</body>
В следующем примере кода показана страница сайта (site.html), которая расширяет шаблон base.html. Блок content будет встроен автоматически в соответствующий блок base.htmclass="underline"
<!{% extends "base.html" %}
{% block content %}
····<p class="important">
····<div id="content">
········<h2>{{title}}</h2>
········<p>{{ list_title }}</p>
········<ul>
············{% for item in list %}
············<li>{{ item[0]}}: {{ item[1]}}</li>
············{% endfor %}
········</ul>
····</div>
····</p>
{% endblock %}
Chameleon
Chameleon Page Templates (файлы с расширением *.pt) (https://chameleon.readthedocs.org/) — это реализация в движке шаблонов синтаксисов Template Attribute Language (TAL) (http://en.wikipedia.org/wiki/Template_Attribute_Language), TAL Expression Syntax (TALES) (http://bit.ly/expression-tales) и Macro Expansion TAL (Metal) (http://bit.ly/macros-metal) для HTML/XML. Chameleon анализирует Page Templates и «компилирует» их в байт-код Python для повышения скорости загрузки.
Доступен в Python 2.5 и выше (включая 3.x и PyPy) и является одним из двух движков для отрисовки, используемых Pyramid по умолчанию (см. подробнее подраздел «Pyramid» ранее в этом разделе). (Вторым является Mako, описанный в следующем подразделе.)
Page Templates добавляет специальный элемент attributes и текстовую разметку для вашего XML-документа: набор простых языковых конструкций позволяет управлять потоком документов, повторением элементов, заменой текста и переводом. Благодаря синтаксису, основанному на атрибутах, неотрисованные шаблоны страниц представляют собой корректный HTML, могут быть просмотрены в браузере и даже отредактированы с помощью редакторов WYSIWYG (What you see is what you get — «Что видишь, то и получаешь»). Это позволяет упростить взаимодействие с дизайнерами, а также прототипирование с использованием статических файлов. Основы языка TAL легко освоить с помощью примера:
<html>
··<body>
··<h1>Hello, <span taclass="underline" replace="context.name">World</span>!</h1>
····<table>
······<tr taclass="underline" repeat="row 'apple', 'banana', 'pineapple'">
········<td taclass="underline" repeat="col 'juice', 'muffin', 'pie'">
············<span taclass="underline" replace="row.capitalize()" /> <span taclass="underline" replace="col" />
········</td>
······</tr>
····</table>
··</body>
</html>
Шаблон <span taclass="underline" replace="expression" /> для вставки текста достаточно распространен. Если вам не нужна стопроцентная корректность для неотрисованных шаблонов, вы можете заменить его на более сжатый и читаемый синтаксис с помощью шаблона ${expression}, как показано далее:
<html>
··<body>
··<h1>Hello, ${world}!</h1>
····<table>
······<tr taclass="underline" repeat="row 'apple', 'banana', 'pineapple'">
········<td taclass="underline" repeat="col 'juice', 'muffin', 'pie'">
············${row.capitalize()} ${col}
········</td>
······</tr>
····</table>
··</body>
</html>
Но помните, что полный синтаксис <span taclass="underline" replace="expression">Default Text</span> также позволяет использовать содержимое по умолчанию в неотрисованном шаблоне.
Chameleon не очень популярен в местах, где уже пользуются Pyramid.
Mako
Mako (http://www.makotemplates.org/) — это язык шаблонов, который компилируется в Python для максимальной производительности. Его синтаксис и API заимствованы из других языков шаблонов вроде Django и Jinja2. Этот язык шаблонов по умолчанию включается в веб-фреймворке Pyramid (рассматривается в подразделе «Pyramid» текущего раздела). Пример шаблона Mako выглядит так:
<%inherit file="base.html"/>
<%
····rows = [[v for v in range(0,10)] for row in range(0,10)]
%>
<table>
····% for row in rows:
········${makerow(row)}
····% endfor
</table>
<%def name="makerow(row)">
····<tr>
····% for name in row:
········<td>${name}</td>\
····% endfor
····</tr>
</%def>
Это текстовый язык разметки, как Jinja2, поэтому его можно использовать для чего угодно (не только для документов XML/HTML). Чтобы отрисовать простой шаблон, введите следующий код:
from mako.template import Template
print(Template("hello ${data}!"). render(data="world"))
Mako имеет хорошую репутацию в сообществе Python. Он быстр и позволяет разработчикам встраивать большое количество логики Python в страницу. Правда, мы рекомендовали бы делать это с осторожностью (только при большой необходимости).