Как изменить хранилище файлов django по умолчанию на облачное хранилище медиафайлов?
Я работаю над проектом django. Он отлично работает с локальным хранилищем и решил использовать cloudinary для хранения мультимедиа, но по какой-то причине хранилище файлов не переключается на облачное хранилище мультимедиа.
Вот мой settings.py файл:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"listings",
"rest_framework",
"rest_framework_simplejwt",
"corsheaders",
'django_filters',
'cloudinary_storage',
'cloudinary',
]
# Cloudinary config
CLOUDINARY_STORAGE = {
"CLOUD_NAME": config("CLOUDINARY_CLOUD_NAME"),
"API_KEY": config("CLOUDINARY_API_KEY"),
"API_SECRET": config("CLOUDINARY_API_SECRET"),
}
cloudinary.config(
cloud_name = config('CLOUDINARY_CLOUD_NAME'),
api_key = config('CLOUDINARY_API_KEY'),
api_secret = config('CLOUDINARY_API_SECRET')
)
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
model.py файл:
class Amenity(models.Model):
name = models.CharField(max_length=100, unique=True)
icon = models.ImageField(upload_to='amenity_icons/', null=True)
Я попытался загрузить с помощью панели администратора. Он сохраняется локально, несмотря на настройки DEFAULT_FILE_STORAGE для 'cloudinary_storage.storage.MediaCloudinaryStorage'
Конфигурация среды загружена правильно (я проверил, распечатав). Вот вывод отладочной оболочки:
>>> from django.conf import settings
>>> from django.core.files.storage import default_storage
>>> print(settings.DEFAULT_FILE_STORAGE)
cloudinary_storage.storage.MediaCloudinaryStorage
>>> print(default_storage.__class__)
<class 'django.core.files.storage.filesystem.FileSystemStorage'>
Я буду работать, если вручную укажу хранилище в каждом поле изображения в каждой модели.
from cloudinary_storage.storage import MediaCloudinaryStorage
class Amenity(models.Model):
name = models.CharField(max_length=100, unique=True)
icon = models.ImageField(
upload_to='amenity_icons/',
null=True,
storage=MediaCloudinaryStorage
)
Ваши настройки кажутся правильными, но, похоже, вам не хватает MEDIA_URL. В ваших настройках:
MEDIA_URL = '/media/' # or any prefix you choose
Также обратите внимание, что вам не нужно настраивать хранилище для загружаемых пользователем медиафайлов, поскольку оно будет использовать значение по умолчанию, которое вы уже установили в DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
Смотрите https://pypi.org/project/django-cloudinary-storage/
Использовать параметр хранилища: вместо DEFAULT_FILE_STORAGE попробуйте использовать параметр STORAGES, который является рекомендуемым способом настройки хранилища файлов в Django 4.2 и более поздних версиях:
STORAGES = {
"default": {
"BACKEND": "cloudinary_storage.storage.MediaCloudinaryStorage",
},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}