Как подключить библиотеку 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. Буду признателен если сообщите об этом.

Вернуться на верх