2010-11-18 5 views
3

Я пытаюсь переключить шаблон Jinja2 в приложении django без перезапуска приложения.Как заставить Jinja2 шаблоны перекомпилировать?

Кто-нибудь это сделал? В основном мне нужно заставить jinja2 перезагрузить шаблоны после применения изменения выбора скина.

Я попытался повторно создать объект кеша в объекте среды шаблона без эффекта.

myskin_utils.py:

from jinja2.environment import create_cache 
ENV_OBJECT.cache = create_cache(50) 

Я также попытался перезагрузить модуль, который содержит мой ENV_OBJECT с

reload(myskin) #also no effect on the output 

Другая вещь, которую я хотел бы изменить на лету является язык, но я думаю, это отдельный вопрос.

Спасибо за любой совет.

редактировать: У меня нет кэш установлен с Jinja2, но я вижу скорость вверх с помощью дзиндзя после переключения из шаблонов Django, я подозреваю, что шаблон байткодом живет в скомпилированный код моего зрения функций, но Я не рассматривал детали джиньи.

У меня есть ENV (экземпляр CoffinEnvironment который подкласс Дзиндзя-х Environment), ввозимые в глобальном пространстве имен модуля просмотра и вызывает ENV.get_template() вид внутри функций (Django + Coffin + jinja2).

Найден, что если я называю reload() встроенной команды питона на моем модуле среды в функции просмотра шаблон делает переключатель, но я не хотел бы, чтобы вставить этот код в любую функцию.

ответ

4

По умолчанию Jinja2 вообще не использует кеширование, но рекомендуется настроить кеширующий сервер, чтобы немного ускорить работу. Так что jinja2 не должен анализировать и компилировать каждый шаблон для каждого запроса. Jinja2 поддерживает в настоящее время 2 разных типа кеширования:

Один из них - FileSystemBytecodeCache, который основан на названии файла. Таким образом, все скомпилированные шаблоны хранятся в файловой системе и извлекаются оттуда. Если вы внимательно посмотрите на реализацию, вы также найдете метод cache.clear(), который просто удалит все файлы в этой временной папке. Устранение всех шаблонов, которые будут проанализированы/скомпилированы снова.

Другой тип кеша называется MemcachedBytecodeCache, который является лишь тонкой оболочкой для Memcache. Этот метод рекомендуется, так как Memcache хранит все в памяти, поэтому он немного быстрее, чем попадание на диск, и вы можете использовать один и тот же кеш с разных хостов (что полезно, если вы используете какой-то кластер).

Основной клиент Memcache (либо werkzeug.contrib.cache, python-memcached, либо cmemcache) также предоставляет метод clear(), который удалит все в кеше. Но поскольку вы, вероятно, используете кеш для других вещей (например, сохраняете результат дорогостоящих запросов к базе данных там), метод clear() не отображается в jinja, потому что он будет влиять на все (а не только на шаблоны).

Итак, подытоживая ваши варианты:

  • Использование Jinja2 без кэша
  • Использование Jinja2 с FileSystemBytecodeCache и вызвать cache.clear()
  • Используйте jinja2 с MemcachedBytecodeCache и вызвать memcache_client.clear() (который также будет ясно все остальное в кеше).
  • Запустите отдельный процесс memcached на другом порту, который используется только с Jinja2. Затем позвоните memcache_client.clear() и все шаблоны будут очищены.
+0

Спасибо! У меня нет кеша для Jinja2. Думаете, я получу дополнительную скорость в своей среде, если я это сделаю? Я понимаю, что мой байт-код шаблона уже в памяти, это правильно или нет? Еще раз спасибо! – Evgeny

+6

Я считаю, что этот ответ неверен - согласно [this] (http://jinja.pocoo.org/docs/api/#bytecode-cache) кеш-байт используется только в первом запуске, а не на каждом запросе. Что касается автоматической перезагрузки измененных шаблонов, есть опция «auto_reload» [здесь] (http://jinja.pocoo.org/docs/api/#jinja2.Environment). Не уверен, что в ноябре 2010 года было так же, поэтому я не отрицаю этот ответ. –

0

Это неправильно. Jinja использует LRUCache в кэше памяти по умолчанию, cache_size (параметр Environment). Вы можете использовать кеш диска для повторной перезагрузки приложения preformant (перекомпиляции не требуется).

Смежные вопросы