Как подключить проект Django к S3 от Yandex

от автора

Выбрал сервис Yandex Object Storage (S3) для медиа (фото) и статики. Потратил пару дней, чтобы подключить. Статью от Яндекса не нашел, использовал пару сторонних сайтов и информацию с Chat GPT. И вот решил написать свою статью.

Начнем с Django. По идее в settings.py у вас так:

# медиа и статичные файлы в режиме разработки STATIC_URL = "static/" STATICFILES_DIRS = [     os.path.join(BASE_DIR, "static"), ] MEDIA_ROOT = f"{BASE_DIR}/media" MEDIA_URL = "/media/"

Переходим в Yandex Cloud. Вы зарегистрировались, переходим в Identity and Access Management для создания сервисного аккаунта.

Главное добавьте роль Admin

Главное добавьте роль Admin

Переходим в сервисный аккаунт и создаем новый ключ (запишите данные: ID и Ключ)

Переходим в Object Storage и создаем бакет. Это простой пример (доступ ограничен, объём неограничен)

Переходим в созданный бакет. Заходим в безопасность и нажимаем Назначить роли.

Назначаем созданному сервисному аккаунту роль Admin. Переходим к Django (settings.py).

Для начала установим пакеты django-storages и boto3. Добавляем приложение ‘storages’ в INSTALLED_APPS.

INSTALLED_APPS = [     ...,     'storages', ]
# медиа и статичные файлы в режиме разработки # STATIC_URL = "static/" # STATICFILES_DIRS = [ #     os.path.join(BASE_DIR, "static"), # ] # MEDIA_ROOT = f"{BASE_DIR}/media" # MEDIA_URL = "/media/"  # связь с Yandex S3 (статика) AWS_S3_ACCESS_KEY_ID = "ваш key_id" AWS_S3_SECRET_ACCESS_KEY = "ваш ключ" AWS_STORAGE_BUCKET_NAME = "имя бакета" AWS_S3_ENDPOINT_URL = "https://storage.yandexcloud.net" AWS_S3_CUSTOM_DOMAIN = f"storage.yandexcloud.net/{AWS_STORAGE_BUCKET_NAME}" AWS_S3_OBJECT_PARAMETERS = {     "CacheControl": "max-age=86400", } STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/" MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/" DEFAULT_FILE_STORAGE = "online_store.s3_storage.MediaStorage" STATICFILES_STORAGE = "online_store.s3_storage.StaticStorage" 

В той же папке, где settings.py создайте файл s3_storage.py. Код внутри файла:

from storages.backends.s3boto3 import S3Boto3Storage  class MediaStorage(S3Boto3Storage):     location = "media" #папка в бакете     file_overwrite = False #запрет на перезапись файлов   class StaticStorage(S3Boto3Storage):     location = "static"     file_overwrite = False 

После запускаем команду:

python manage.py collectsatic и проверяем

Спасибо за прочтение 🙂


ссылка на оригинал статьи https://habr.com/ru/articles/938040/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *