Начиная с версии 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.

Вернуться на верх