Pandora ResearchPandora
Research
RUEN
Backend

Подключение S3-хранилища к проекту Django

Pandora ResearchPandora Research
16 июля 20265 мин чтения

Всё большую популярность набирает подключение S3-совместимых хранилищ для раздачи статических файлов.

В этой статье рассмотрим подключение S3-хранилища от Yandex.Cloud к проекту Django. Процесс создания учётной записи в Yandex.Cloud, подключения услуги Object Storage, получения ключей доступа и создания бакета мы опустим — считаем, что это уже сделано.

Установка пакетов

Для начала установим пакеты django-storages и boto3:

Terminal
pip install django-storages
pip install boto3

Классы хранилищ

Создадим файл s3_storage.py в той же папке, что и settings.py, — он будет описывать наши кастомные классы хранилищ. Добавим в него следующий код:

s3_storage.py
from storages.backends.s3boto3 import S3Boto3Storage


class MediaStorage(S3Boto3Storage):
    bucket_name = 'my_bucket'
    location = 'media'


class StaticStorage(S3Boto3Storage):
    bucket_name = 'my_bucket'
    location = 'static'

Здесь мы создаём два класса: MediaStorage описывает хранилище для медиафайлов, а StaticStorage — для статических файлов. Для обоих указан один бакет my_bucket, но файлы будут храниться в двух разных папках — media и static.

Настройки settings.py

В файл настроек settings.py добавим следующие параметры:

settings.py
DEFAULT_FILE_STORAGE = 'my_app.s3_storage.MediaStorage'
STATICFILES_STORAGE = 'my_app.s3_storage.StaticStorage'

AWS_S3_ENDPOINT_URL = 'https://storage.yandexcloud.net'
AWS_S3_ACCESS_KEY_ID = os.getenv('AWS_S3_ACCESS_KEY_ID')
AWS_S3_SECRET_ACCESS_KEY = os.getenv('AWS_S3_SECRET_ACCESS_KEY')
AWS_QUERYSTRING_AUTH = False

В переменную INSTALLED_APPS добавим приложение storages:

settings.py
INSTALLED_APPS = [
    ...,
    'storages',
]

Переменные DEFAULT_FILE_STORAGE и STATICFILES_STORAGE указывают, какие классы использовать для обработки медиа- и статических файлов соответственно.

В AWS_S3_ENDPOINT_URL задаётся URL Yandex.Cloud для раздачи файлов. В AWS_S3_ACCESS_KEY_ID и AWS_S3_SECRET_ACCESS_KEY — уникальный идентификатор и секретный ключ для доступа к API хранилища.

Переменная AWS_QUERYSTRING_AUTH отвечает за добавление query-параметров аутентификации при доступе к S3. Её имеет смысл выставить в False, если хранилище публичное.

Загрузка файлов

Настройки завершены. Сначала отправим статические файлы в S3-хранилище — командой сбора статики:

Terminal
python manage.py collectstatic

Дожидаемся окончания передачи файлов. Чтобы протестировать медиафайлы, создайте объект, в модели которого есть поля ImageField или FileField, и приложите к нему файлы — после сохранения они должны появиться в S3-хранилище.

PythonDjango

Есть задача для нашей команды?

Расскажите о проекте — оценим и предложим решение в течение одного рабочего дня.

Обсудить проект