Перевод публикации Django Template Improvements с DjangoAdvent
Инициализация
Почти каждый запрос на вашем сайте Django выражается в виде шаблона. В среде разработки Django это осуществляется практически мгновенно — в конце концов, не так уж накладно загрузить файл шаблона и компилировать его перед отображением каждого запроса. Но что происходит, если ваш сайт при каждом запросе обрабатывает сотни шаблонов? Если при одном запросе отображается 500 шаблонов (даже если на создание одного шаблона уходит одна миллисекунда) на отображение каждого запроса затрачивается уже полсекунды. При разработке программного обеспечения Motion software разработчики в службе TypePad столкнулись именно с этой проблемой. Шаблонная система была усовершенствована, и в результате появилась возможность кэшировать скомпилированные объекты-шаблоны, впрочем, данные усовершенствования делают систему загрузки шаблонов более гибкой и в других отношениях.
Кэширование
Самое заметное улучшение, которое представляет массив изменений changeset 11862 ― включение в систему нового загрузчика кэшированных шаблонов. Данный загрузчик реализуется со списком остальных загрузчиков шаблонов, после этого он загружает шаблоны посредством использования данных загрузчиков, однако при этом осуществляется кэширование скомпилированных объектов-шаблонов. Это очень целесообразно, по сравнению с тем, что ранее каждый шаблон повторно преобразовывался и компилировался при каждом отображении. Отображение большого количества шаблонов при каждом запросе (например, включение ещё одного шаблона в контур системы) зачастую приводило к увеличению затрат ресурсов.
Если вы хотите обновить ваш сайт и воспользоваться преимуществами данного загрузчика – необходимо изменить настройки. Загрузчик кешированных шаблонов настраивается таким образом, что в него включаются обычные загрузчики. Обернутые таким образом загрузчики используются для обнаружения неизвестных шаблонов. После этого кэшированный загрузчик сохраняет скомпилированный шаблон Template в памяти. Копия кэшированного шаблона Template используется при последующих запросах, чтобы загрузить аналогичный шаблон.
Например, чтобы разрешить кэширование шаблона загрузчиками шаблонов filesystem и app_directories, необходимо чтобы параметры настройки выглядели следующим образом:
TEMPLATE_LOADERS = ( ('django.template.loaders.cached.Loader', ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', )), )
Предостережение
Для обеспечения выполнения запросов Django в большинстве систем, в которых размещается среда Django, используется множество программных потоков (multiple threads). По сути, в этом и заключалась одна их основных проблем поддержки кэшированных шаблонов в среде Django. Причина состоит в том, что кэшированный шаблон может одновременно использоваться несколькими многопоточными приложениями. До установки данного патча, объекты-шаблоны Django не были потоко-безопасными (поточно-ориентированными); отображение одного и того же объекта-шаблона многопоточными приложениями могло привести к ошибочным результатам. Впрочем, после применения данного патча объекты-шаблоны Django стали потоко-безопасными, включая все встроенные шаблонные теги (в частности {% block %} и {% cycle %}).
Перед использованием загрузчика кэшированных шаблонов с собственными приложениями, убедитесь в том, что пользовательские шаблонные теги являются потоко-безопасными. В документации к среде Django предоставлено отличное руководство по проведению данных расчетов.
Дополнительное преимущество
До недавнего времени загрузчики шаблонов были необходимы для вывода строки шаблона, а не самого объекта-шаблона. Вышеупомянутый патч исправляет и эту проблему. Суть проблемы в том, что основная задача загрузчика кэшированных шаблонов – возврат и вывод предварительно скомпилированного объекта-шаблона. Таким образом, данный патч позволяет загрузчику шаблонов выдавать объекты-шаблоны1. Опять-таки стало возможным создавать загрузчики шаблонов, которые работают с другими шаблонными языками (такими как Jinja, Cheeta, Mako и другими, которые действуют по принципу строка-словарь). Раньше, в случае необходимости использовать другой шаблонный язык требовалось либо тщательно разбираться и самостоятельно «латать» Django, либо заменять каждый переход чем-то вроде render_to_response() со своей функцией, использующей альтернативный шаблонный язык. Теперь в Django 1.2 все, что нужно сделать – написать загрузчик шаблона методом load_template(), который и выдаёт объект-шаблон.
Заключение
Данный патч значительно повышает эффективность и производительность шаблонной системы Django. Что касается пользования всеми преимуществами шаблонной системы ― читайте документацию, она как всегда выполнена на высоте.
Оригинал статьи: http://djangoadvent.com/1.2/django-template-improvements/
Добавить комментарий