Всё большую популярность набирает подключение S3-совместимых хранилищ для раздачи статических файлов.
В этой статье рассмотрим подключение S3-хранилища от Yandex.Cloud к проекту Django. Процесс создания учётной записи в Yandex.Cloud, подключения услуги Object Storage, получения ключей доступа и создания бакета мы опустим — считаем, что это уже сделано.
Установка пакетов
Для начала установим пакеты django-storages и boto3:
pip install django-storages
pip install boto3Классы хранилищ
Создадим файл s3_storage.py в той же папке, что и settings.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 добавим следующие параметры:
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:
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-хранилище — командой сбора статики:
python manage.py collectstaticДожидаемся окончания передачи файлов. Чтобы протестировать медиафайлы, создайте объект, в модели которого есть поля ImageField или FileField, и приложите к нему файлы — после сохранения они должны появиться в S3-хранилище.