Django и whitenoise - кэширование "слишком много"
Я использую Whitenoise для обслуживания статических файлов (изображения, css, js) для сайта Django. Теперь моя проблема заключается в том, что статические файлы, кажется, "кэшируются на много"(?) при локальной работе. Описание действий:
- Изначально мои статические файлы обслуживаются правильно
- Я редактирую файл в
static/
- Я запускаю
./manage.py collectstatic
(который правильно идентифицирует один обновленный файл). - При переходе к
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):
...