Выбрать главу

····{% 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 в страницу. Правда, мы рекомендовали бы делать это с осторожностью (только при большой необходимости).