#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. Эта команда сделала это! Большое вам спасибо, похоже, теперь он работает безупречно!