Мы рекомендуем выбирать Jinja2 (http://jinja.pocoo.org/) в качестве библиотеки шаблонов для новых веб-приложений Python. Используется в качестве движка по умолчанию в Flask и генераторе документации для Python Sphinx (http://www.sphinx-doc.org/), может применяться в Django, Pyramid и Tornado. Она работает с основанным на тексте языком шаблонов, поэтому подойдет для генерации любой разметки, а не только HTML.
Позволяет настраивать фильтры, теги, тесты и глобальные переменные. Предоставляет возможность добавлять логику в шаблоны, что сокращает объемы кода.
Рассмотрим важные теги Jinja2:
{# Это комментарий, он выделяется решеткой и фигурными скобками. #}
{# Так можно добавить переменную: #}
{{title}}
{# Так можно определить именованный блок, который можно заменить #}
{# на шаблон-потомок. #}
{% block head %}
{% endblock %}
{# Так можно выполнить итерирование: #}
{% for item in list %}
{% endfor %}
Рассмотрим пример сайта в комбинации с веб-сервером Tornado, описанным в подразделе «Tornado» текущего раздела:
# импортируем Jinja2
from jinja2 import Environment, FileSystemLoader
# импортируем Tornado
import tornado.ioloop
import tornado.web
# Загружаем файл шаблона templates/site.html
TEMPLATE_FILE = "site.html"
templateLoader = FileSystemLoader( searchpath="templates/" )
templateEnv = Environment( loader=templateLoader )
template = templateEnv.get_template(TEMPLATE_FILE)
# Список популярных фильмов
movie_list = [
[1,"The Hitchhiker's Guide to the Galaxy"],
[2,"Back to the Future"],
[3,"The Matrix"]
]
# Метод template.render() возвращает строку, содержащую отрисованный HTML
html_output = template.render(list=movie_list, title="My favorite movies")
# Обработчик для основной страницы
class MainHandler(tornado.web.RequestHandler):
def get(self):
# Возвращает отрисованную строку шаблона запросу браузера
self.write(html_output)
# Присваиваем обработчик на сервер (127.0.0.1:PORT/)
application = tornado.web.Application([
(r"/", MainHandler),
])
PORT=8884
if __name__ == "__main__":
# Настраиваем сервер
application.listen(PORT)
tornado.ioloop.IOLoop.instance().start()
Файл base.html может быть использован в качестве основы для всех страниц сайта. В этом примере они могли бы быть реализованы в блоке content (в данный момент пуст):
{# В следующей строке будет добавлено содержимое шаблона site.html #}
{% block content %}{% endblock %}
{% block footer %}
© Copyright 2013 by you.
{% endblock %}