Как подключить библиотеку django-storages к S3 хранилищу?
Я собираю проект на DRF. Пытаюсь подключить S3-хранилище. Бесплатным периодом заманил наш российский провайдер. У них есть инструкция как подключиться с библиотекой boto3. Однако в джанго используется библиотека построенная поверх boto3 - django-storages.
В settings.py использую следующий код для подключения к S3:
USE_S3 = ast.literal_eval(os.getenv('USE_S3', 'False'))
if USE_S3:
tenant_id = os.getenv('S3_TENANT_ID')
access_key = f"{tenant_id}:{os.getenv('S3_KEY_ID')}"
secret_key = os.getenv('S3_KEY_SECRET')
bucket_name = os.getenv('S3_BUCKET_NAME')
s3_host = os.getenv('S3_HOST')
region_name = os.getenv('S3_REGION')
STORAGES = {
"default": {
"BACKEND": "storages.backends.s3.S3Storage",
"OPTIONS": {
"access_key": access_key,
"secret_key": secret_key,
"bucket_name": bucket_name,
"endpoint_url": s3_host,
"region_name": region_name,
},
},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
}
}
else:
STORAGES = {
'default': {
"BACKEND": 'django.core.files.storage.FileSystemStorage',
},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}
# Creating a "media" folder, if it does not exist
media_dir = os.path.join(BASE_DIR, 'media')
if not os.path.exists(media_dir):
os.mkdir(media_dir)
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
Ошибка следующая: An error occurred (MissingContentLength) when calling the PutObject operation: You must provide the Content-Length HTTP header
Пробовал добавить в OPTIONS параметр "signature_version": "s3". В таком случае выходит следующая ошибка: An error occurred (NotImplemented) when calling the PutObject operation: AWS signature V2 not supported
Файлы я пробую загружать через стандартную админку джанги.
Я новичок в этом всём. Пожалуйста подскажите, что и куда нужно копать, как исправить эти ошибки? Наверняка у кого-то был опыт. Ссылка на документацию провайдера. Заранее спасибо
Я обнаружил в интернете, рекомендации установить старую версию boto3, а именно boto3==1.35.95
.
Решил попробовать это сделать, и действительно я перестал получать ошибку, и файл успешно отправился в S3.
Не знаю в последней версии boto3 это была ошибка разработчиков, или вообще поменялась какая-либо логика работы с этой библиотекой, но адекватного решения работы в Django с последней версией boto я пока не нашёл.
Возможно кто-то знает, как сделать работу Django с последней версией boto. Буду признателен если сообщите об этом.