Django AWS s3 может загружать файлы, но не получать к ним доступ

#django #amazon-web-services #amazon-s3 #boto3 #python-django-storages

#django #amazon-веб-сервисы #amazon-s3 #boto3 #python-django-хранилища

Вопрос:

Следуя этому руководству, я настроил нашу систему на использование хранилища файлов Amazons S3 с использованием boto3 и Django-storages. Я выполнил collectstatic команду, и она сработала просто отлично, файлы отображаются в консоли управления AWS. Но при локальном запуске сервера ( runserver ) все статические файлы отсутствуют. Глядя на консоль, появляются сообщения об ошибках

 GET https://BUCKET.s3.eu-central-1.amazonaws.com/static/admin/css/nav_sidebar.css net::ERR_ABORTED 403 (Forbidden)
  

для каждого из файлов. URL-адрес выглядит правильно для меня, загрузка работала нормально, но, видимо, доступ не работает. Имеет ли это какое-то отношение к моей конфигурации в AWS? Или это проблема с настройками Django?

Файл настроек выглядит следующим образом:

 STATICFILES_DIRS = []
AWS_ACCESS_KEY_ID = 'XYZ'
AWS_SECRET_ACCESS_KEY = 'XYZ'
AWS_STORAGE_BUCKET_NAME = 'BUCKET'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

AWS_STATIC_LOCATION = 'static'
STATICFILES_STORAGE = 'hq.storage_backends.StaticStorage'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)

AWS_MEDIA_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'hq.storage_backends.MediaStorage'

  

Комментарии:

1. убедитесь, что политика корзины является общедоступной (и файлы общедоступны), если вы можете попытаться запустить runserver --insecure ее, не используйте ее в производстве, хотя, очевидно, если файлы недоступны для общественности, вы можете попробовать установить AWS_DEFAULT_ACL='public-read' и запустить collect static снова, чтобы сделать их общедоступными

2. Блокировка всего общедоступного доступа была включена, я пока отключил ее. Как я мог что-то загрузить, если доступ заблокирован?

3. вы используете учетные данные для корзины, что дает вам возможность размещать изображения в корзине, но поскольку политика по умолчанию недоступна для общественности, она не возвращается при запросе без учетных данных, однако, поскольку это статические данные, вероятно, неплохо сделать их общедоступными, или вы либовозможно, вам захочется настроить aws так, чтобы для этого сегмента разрешался только ваш конкретный домен

Ответ №1:

убедитесь, что политика корзины общедоступна (и файлы общедоступны), если это так, вы можете попытаться запустить runserver -небезопасно, не используйте его в производстве, хотя, очевидно, если файлы недоступны для общественности, вы можете попробовать установить AWS_DEFAULT_ACL='public-read' и запустить collect static снова, чтобы сделать их общедоступными

Я бы предложил использовать environ для изменения этих настроек примерно так

 import environ

...

AWS_DEFAULT_ACL = env('AWS_DEFAULT_ACL')
  

в вашем settings.py или где бы вы ни хранили настройки в s3 bucket
И используйте переменные среды, чтобы изменить это при необходимости

Итак, после установки и настройки environ вы можете легко изменить это, используя переменные env, просто установив AWS_DEFAULT_ACL значение public-read like export AWS_DEFAULT_ACL=public-read

Комментарии:

1. Эта команда сделала это! Большое вам спасибо, похоже, теперь он работает безупречно!