Проблема с кэшированием Django при развертывании на платформе DigitalOcean App Platform
Я следовал руководству How To Deploy a Django App on App Platform от DigitalOcean и успешно создал Django-сервер, который я использую через /admin
страницы.
Через App Platform я использую GitHub для отправки изменений на производство. У меня возникла проблема с файлами CSS и JS, которые не обновляются после отправки изменений: Я пробовал обновлять браузер, использовать другой браузер, удалять кэш браузера, но ничего не помогает, файлы не обновляются. Используя консоль, я вижу, что файлы обновляются на сервере (в том числе под staticfiles
), но они не обновляются в браузере.
Я прочитал о настройке STORAGES и классе ManifestStaticFilesStorage, поэтому я попробовал добавить следующую настройку в качестве средства для очистки кэша:
STORAGES = {
'staticfiles': {
'BACKEND': 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage',
},
'default': {
'BACKEND': 'django.core.files.storage.FileSystemStorage',
},
}
Когда я разворачиваю это на производстве, кажется, что все падает за исключением страницы, на которой я сейчас нахожусь (с JS/CSS, которые я тестировал). Я пробовал развертывать с DEBUG=True
, но это влияет на выполнение тега static
, изменяя, ищет ли Django файлы с обычным или хэшированным именем, поэтому это не воспроизводит ошибки.
Я в тупике, как мне вообще это отладить?
В моем файле настроек Django есть:
# settings.py
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
На App Platform у меня есть прикрепленный компонент статического ресурса с одним маршрутом HTTP-запроса /static
и выходным каталогом staticfiles
.
- Сначала установите WhiteNoise:
pip install whitenoise
- Добавьте WhiteNoise к вашему промежуточному ПО в
settings.py
. Убедитесь, что он добавлен после промежуточного ПО безопасности и перед всем остальным промежуточным ПО:
MIDDLEWARE = [
# ...
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware", # Add this line
# ...
]
- Настройте хранение статических файлов в
settings.py
:
STORAGES = {
"default": {
# Your cloud storage backend configuration for media files
# For example, for AWS:
# "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
},
"staticfiles": {
# Comment out or remove the default static files storage
# "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
# Use WhiteNoise's compressed manifest static files storage
"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
},
}
- Добавьте команду collectstatic в команды предварительного развертывания:
python manage.py collectstatic --no-input
Эта установка позволит:
- Эффективное сохранение статических файлов с помощью WhiteNoise
- Сжимайте и добавляйте заголовки кэша к вашим статическим файлам
- Создайте манифест всех ваших статических файлов с хэшированными именами для очистки кэша
Примечание: Убедитесь, что ваш STATIC_ROOT
правильно настроен в файле settings.py:
STATIC_ROOT = BASE_DIR / "staticfiles" # or your preferred static files directory