Файлы статики Django не загружаются из AWS S3 после выполнения collectstatic

Вопрос или проблема

Я работаю над проектом на Django, где хочу хранить и обслуживать статические файлы с помощью AWS S3. Я следовал обычным шагам по настройке и настроил свой settings.py для использования S3 для статических файлов. Однако после выполнения collectstatic мои статические файлы не загружаются, и я не могу получить к ним доступ через корзину S3.

Вот краткое резюме того, что я сделал до сих пор:

Настройка в settings.py:

# Учетные данные AWS
AWS_ACCESS_KEY_ID = 'мой-доступный-ключ'
AWS_SECRET_ACCESS_KEY = 'мой-секретный-ключ'
AWS_STORAGE_BUCKET_NAME = 'cats-gallery-amanda'

# Настройки статических файлов S3
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_DEFAULT_ACL = 'public-read'
AWS_LOCATION = 'static'
AWS_QUERYSTRING_AUTH = False
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

# Настройки статических файлов
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# Директории
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'setup/static'),
]

Что я пробовал:

  1. Выполнение collectstatic:

Команда: python manage.py collectstatic
Вывод сообщает: 0 статических файлов скопировано в ‘static/’, 176 не изменены.

  1. Разрешения на корзину S3:

Я установил политику корзины для разрешения публичного доступа:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::cats-gallery-amanda/static/*"
    }
  ]
}

  1. Проверка файлов в S3:

После выполнения collectstatic в корзине S3 в разделе static/ нет файлов.

  1. Попытки решения:
  • Проверил, что django-storages и boto3 установлены.
  • Дважды проверил учетные данные AWS.
  • Убедился, что корзина S3 доступна для общего доступа.
  • Пытался вручную загружать файлы в S3, и они работают нормально.

Что я упускаю?

Я не могу понять, почему collectstatic не загружает статические файлы в корзину S3. Нужно ли мне что-то еще настроить? Как мне заставить статические файлы загружаться и правильно обслуживаться из S3?

Буду признателен за любые советы или рекомендации по устранению неполадок!

Ответ или решение

Обработка статических файлов в Django с использованием AWS S3 может вызывать некоторые сложности. Рассмотрим шаги, которые помогут вам решить проблему с загрузкой статических файлов на S3 и их отображением.

1. Проверка конфигурации settings.py

Ваш файл настроек settings.py выглядит в целом корректно, но давайте убедимся, что все значения правильно определены и настроены:

# AWS Credentials
AWS_ACCESS_KEY_ID = 'my-access-key'
AWS_SECRET_ACCESS_KEY = 'my-secret-key'
AWS_STORAGE_BUCKET_NAME = 'cats-gallery-amanda'

# S3 Static File Settings
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_DEFAULT_ACL = 'public-read'
AWS_LOCATION = 'static'
AWS_QUERYSTRING_AUTH = False
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

# Static Files Settings
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# Directories
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'setup/static'),
]

2. Убедитесь, что collectstatic выполняется правильно

Когда вы выполняете команду python manage.py collectstatic, она должна копировать файлы из всех указанных в STATICFILES_DIRS и вашего приложения в S3. Если вывод показывает, что "0 статических файлов скопировано", это может означать, что Django не обнаруживает файлы в указанных директориях.

  • Проверьте, существуют ли статические файлы в setup/static и других директориях. Убедитесь, что файлы имеют поддержку STATICFILES_FINDERS.
  • Возможно, файлы не модифицированы и поэтому не были скопированы. Попробуйте внести небольшие изменения (например, добавить новый статический файл) и снова выполните collectstatic.

3. Проверьте права доступа к S3

Убедитесь, что у вашей корзины S3 установлена правильная политика. Вы указали политику, но также убедитесь, что в настройках корзины отключена блокировка публичного доступа:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::cats-gallery-amanda/static/*"
    }
  ]
}

4. Убедитесь, что библиотеки установлены и правильно настроены

Вы уже проверили, что django-storages и boto3 установлены. Убедитесь, что они обновлены до последних версий:

pip install django-storages boto3 --upgrade

5. Логи и отладка

Попробуйте добавить отладку в ваш проект, чтобы увидеть, что происходит в процессе выполнения collectstatic. Включите отладочную информацию, добавив следующее в settings.py:

import logging

logging.basicConfig(level=logging.DEBUG)

После этого перезапустите сборку статических файлов и посмотрите, что отображается в логах.

6. Проверка файлов в S3

Если после выполнения всех шагов файлы всё ещё не загружаются, попробуйте вручную загрузить один файл с помощью SDK (например, с помощью boto3) и убедитесь, что файлы загружаются корректно.

Заключение

Если после выполнения всех предложенных шагов проблема остаётся нерешённой, стоит проверить конфигурацию вашей среды (например, наличие зависимостей, правильные переменные окружения) и, возможно, обратиться к логам AWS S3 для получения дополнительной информации об ошибках доступа или загрузки.

Надеюсь, это поможет вам решить проблему с загрузкой статических файлов в вашей проекте Django!

Оцените материал
Добавить комментарий

Капча загружается...