Начиная с версии django 4.1, шаблоны кэшируются с DEBUG=True. Является ли это решение правильным?
Как описано в документации, начиная с версии 4.1 поведение по умолчанию для загрузки шаблонов сильно изменилось.
Если я правильно понимаю, до версии 4.0 это работало следующим образом:
- При включенном DEBUG шаблоны загружаются при каждом запросе, поэтому если вы постоянно вносите изменения и перезагружаете шаблон, вы всегда видите последнюю версию.
- При отключенном DEBUG шаблоны кэшируются при инициализации приложения, поэтому вы сможете увидеть изменения в ваших шаблонах, только если вы перезапустите приложение.
Таким образом, кэширование шаблонов было без проблем включено в продакшн, что просто замечательно.
Сейчас в этот тикет включено предложение и, если я правильно понял, метод загрузки шаблона должен быть указан и он больше не привязан к настройке DEBUG, И, по умолчанию, кэшируются.
Мы хотим оригинальное поведение, чтобы разработчик фронтенда мог видеть изменения без необходимости перезапуска приложения, и мы также хотим, чтобы в производственном развертывании было включено кэширование, поэтому мы сделали следующее:
develop_loaders = [
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
]
production_loaders = [
("django.template.loaders.cached.Loader", [
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
"path.to.custom.Loader",
])
]
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
"templates",
],
"OPTIONS": {
"context_processors": [
"maintenance_mode.context_processors.maintenance_mode",
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
"wagtail.contrib.settings.context_processors.settings",
],
"loaders": develop_loaders if DEBUG else production_loaders,
},
},
]
Это работает, но мне интересно, правильно ли я понимаю ситуацию? Считаете ли вы, что это надежное решение? .
Также это заняло у меня некоторое время, потому что когда я читал журнал изменений для 4.1, я не понимал, что это изменение будет иметь такое влияние (мы никогда не указывали загрузчик в настройках), поэтому мы ожидали, что поведение по умолчанию будет соблюдаться, что привело к рассмотрению gunicorn и docker в качестве первых подозрительных виновников и т.д... поэтому я подумал, что этот вопрос может быть полезен для других людей в аналогичной ситуации.
Проблема не в кэшированном загрузчике, а в обработке сигналов в вашей ОС. Кэшированный загрузчик имеет метод reset
, который вызывается на file_changed
, таким образом, вы можете извлечь пользу даже при отладке кэшированных шаблонов.
Используете ли вы runserver_plus
? Для этого есть выпуск: https://github.com/django-extensions/django-extensions/issues/1766
Я не испытываю проблемы с обычной командой runserver
.