Задать вопрос
@ynchk1

Как использовать S3 хранилище в Django проекте?

У меня есть проект на Django, к которому я хочу подключить S3 хранилище от Timeweb.

Моя конфигурация:
# settings.py
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY = 'secret_key'
AWS_STORAGE_BUCKET_NAME = 'bucket_name'
AWS_S3_REGION_NAME = 'ru-1' 
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.timeweb.cloud"
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# models.py
class Products(models.Model):
    ...
    second_url = models.ImageField(upload_to='products/') # сохранение в директорию бакета


При попытке отправке формы в админ панели, Django сохраняет фотографию в директории проекта. Как сделать так, чтобы DJango отправлял фотографию в мой бакет?
  • Вопрос задан
  • 147 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@ynchk1 Автор вопроса
Происходила следующая проблема:
An error occurred (XAmzContentSHA256Mismatch) when calling the PutObject operation: The provided 'x-amz-content-sha256' header does not match what was computed.


Решение нашел в добавлении строчки 'signature_version': 's3'

Весь код:
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'  

STORAGES = {
    'default': {
    'BACKEND': 'storages.backends.s3.S3Storage',
    'OPTIONS': {
        'access_key': os.getenv('AWS_ACCESS_KEY_ID'),
        'secret_key': os.getenv('AWS_SECRET_ACCESS_KEY'),
        'bucket_name': os.getenv('AWS_STORAGE_BUCKET_NAME'),
        'endpoint_url': os.getenv('AWS_S3_ENDPOINT_URL'),
        'signature_version': 's3' 
        },
    },
    'staticfiles': {
    'BACKEND': 'storages.backends.s3.S3Storage',
    'OPTIONS': {
        'access_key': os.getenv('AWS_ACCESS_KEY_ID'),
        'secret_key': os.getenv('AWS_SECRET_ACCESS_KEY'),
        'bucket_name': os.getenv('AWS_STORAGE_BUCKET_NAME'),
        'endpoint_url': os.getenv('AWS_S3_ENDPOINT_URL'),
        'signature_version': 's3' 
    },
    } 
}

MEDIA_URL = f'{os.getenv('AWS_S3_ENDPOINT_URL')}/{os.getenv('AWS_STORAGE_BUCKET_NAME')}/media/'
STATIC_URL = f'{os.getenv('AWS_S3_ENDPOINT_URL')}/{os.getenv('AWS_STORAGE_BUCKET_NAME')}/static/'
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
перед тем как сюда бежать, надо было просто почитать доки https://django-storages.readthedocs.io/en/latest/b...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы