Как заставить шаблоны Jinja2 перекомпилировать? - PullRequest
3 голосов
/ 18 ноября 2010

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

Кто-нибудь делал это?В основном мне нужно заставить 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

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

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

edit: У меня нет кеша, настроенного с помощью jinja2, но я вижу ускорениеот использования Jinja после переключения с шаблонов Django, я подозреваю, что байт-код шаблона находится в скомпилированном коде моих функций просмотра, но я не изучал детали jinja.Подклассы Jinja Environment) импортируются в глобальное пространство имен модуля представления и вызывают ENV.get_template() внутри функций представления (Django + Coffin + Jinja2).

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

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

По умолчанию 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 голосов
/ 07 марта 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...