Проблема с кэшированием 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.

  1. Сначала установите WhiteNoise:
pip install whitenoise
  1. Добавьте WhiteNoise к вашему промежуточному ПО в settings.py. Убедитесь, что он добавлен после промежуточного ПО безопасности и перед всем остальным промежуточным ПО:
MIDDLEWARE = [
    # ...
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",  # Add this line
    # ...
]
  1. Настройте хранение статических файлов в 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",
    },
}
  1. Добавьте команду collectstatic в команды предварительного развертывания:
python manage.py collectstatic --no-input

Эта установка позволит:

  • Эффективное сохранение статических файлов с помощью WhiteNoise
  • Сжимайте и добавляйте заголовки кэша к вашим статическим файлам
  • Создайте манифест всех ваших статических файлов с хэшированными именами для очистки кэша

Примечание: Убедитесь, что ваш STATIC_ROOT правильно настроен в файле settings.py:

STATIC_ROOT = BASE_DIR / "staticfiles"  # or your preferred static files directory
Вернуться на верх