Django и whitenoise - кэширование "слишком много"

Я использую Whitenoise для обслуживания статических файлов (изображения, css, js) для сайта Django. Теперь моя проблема заключается в том, что статические файлы, кажется, "кэшируются на много"(?) при локальной работе. Описание действий:

  1. Изначально мои статические файлы обслуживаются правильно
  2. Я редактирую файл в static/
  3. Я запускаю ./manage.py collectstatic (который правильно идентифицирует один обновленный файл).
  4. При переходе к http://127.0.0.1:8000/ мой браузер последовательно показывает старую несвежую версию файла. Я даже пробовал полностью удалить созданную папку staticfiles/ - и браузер все равно, похоже, способен выкопать старую версию файла.

Это при локальном запуске в режиме отладки. У меня нет последовательного понимания того, как это происходит в production, но я думаю, что там это работает лучше (как и должно быть?).

Моя конфигурация:



MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    ....

INSTALLED_APPS = [
    # My apps 
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
...
...
STATIC_URL = 'static/'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATIC_ROOT = BASE_DIR / 'staticfiles'

STATICFILES_DIRS = [
    ("js"  , BASE_DIR / "static/js"),
    ("css" , BASE_DIR / "static/css"),
    ("img" , BASE_DIR / "static/img")
]

Полагаю, проблема в том, что я не очень понимаю модель Whitenoise - немного разочаровывает, поскольку это должно быть довольно просто?

Update: Я протестировал это в Firefox с Ctrl-Shift R для перезагрузки страницы, и получил старую версию. Но при фактическом удалении кэша браузера явно все работает. Кажется немного чрезмерным, что мне приходится вручную стирать историю браузера - но я могу с этим жить.

Если жесткая перезагрузка работает, то браузер, скорее всего, кэширует родительский запрос (результат рендеринга html).

Так, если у вас есть конечная точка /myendpoint/, которая возвращает отрисованный шаблон, где шаблон содержит статическую ссылку на файл, обработанную whitenoise, css/mycss.{hash}.css, родительский запрос кэшируется, и браузер не видит обновленной статической ссылки на файл.

В Django есть некоторые инструменты, которые помогают справиться с кэшированием.

https://docs.djangoproject.com/en/3.2/topics/cache/#controlling-cache-using-other-headers

Если вы хотите убедиться, что клиент всегда получает последнюю страницу, вы можете использовать декоратор never_cache.

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
    ...

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