Все большую популярность набирает подключение S3 совместимых хранилищ для раздачи статических файлов.
В данной статье рассмотрим подключение S3 хранилища от Yandex.Cloud к проекту Django. Мы опустим процесс создания учетной записи в Yandex.Cloud, подключения услуги Object Storage, получения ключей доступа, а также создания бакета. Допускаем, что это уже сделано.
Для начала установим пакеты django-storages и boto3:
1pip install django-storages
2pip install boto3
Создадим файл s3_storage.py, в той же папке, что и settings.py, который будет описывать наши кастомные классы хранилищ. Добавим в него следующий код:
1from storages.backends.s3boto3 import S3Boto3Storage
2
3
4class MediaStorage(S3Boto3Storage):
5 bucket_name = 'my_bucket'
6 location = 'media'
7
8
9class StaticStorage(S3Boto3Storage):
10 bucket_name = 'my_bucket'
11 location = 'static'
Тут мы создаем два класса, MediaStorage описывает хранилище для медиа файлов, а StaticStorage описывает хранилище для статических файлов. Для обоих хранилищ мы указали один бакет `my_bucket`, но при этом файлы будут храниться в двух разных папках - `media` и `static`.
В файл настроек `settings.py` добавим следующие параметры:
1DEFAULT_FILE_STORAGE = 'my_app.s3_storage.MediaStorage'
2STATICFILES_STORAGE = 'my_app.s3_storage.StaticStorage'
3
4AWS_S3_ENDPOINT_URL = 'https://storage.yandexcloud.net'
5AWS_S3_ACCESS_KEY_ID = os.getenv('AWS_S3_ACCESS_KEY_ID')
6AWS_S3_SECRET_ACCESS_KEY = os.getenv('AWS_S3_SECRET_ACCESS_KEY')
7AWS_QUERYSTRING_AUTH = False
В переменную `INSTALLED_APPS` добавим приложение `storages`.
1INSTALLED_APPS = [
2 ...,
3 'storages',
4]
Переменные `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 хранилище. Для этого вводим команду для сбора статики:
1python manage.py collectstatic
Дожидаемся окончания передачи файлов. Чтобы протестировать медиа файлы, нужно попробовать создать объект, в модели которого есть поля с типами `ImageField` или `FileField`, добавив к нему файлы. После сохранения файлы должны появиться в S3 хранилище.