Django项目无法切换默认文件存储为Cloudinary媒体存储的问题求助
Django项目无法切换默认文件存储为Cloudinary媒体存储的问题求助
大家好,我最近在开发一个Django项目,本地存储媒体文件的功能一切正常,但决定改用Cloudinary托管媒体文件后遇到了棘手问题——明明在配置里设置了默认文件存储为Cloudinary的媒体存储,可上传的文件还是会存在本地。
以下是我的相关配置和调试信息:
1. settings.py 配置
我已经在INSTALLED_APPS中添加了cloudinary_storage和cloudinary,配置了Cloudinary的相关参数,也设置了DEFAULT_FILE_STORAGE:
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'
2. models.py 代码
我的模型里有一个带ImageField的类,目前没有手动指定storage:
class Amenity(models.Model): name = models.CharField(max_length=100, unique=True) icon = models.ImageField(upload_to='amenity_icons/', null=True)
3. 调试情况
我通过Django shell做了调试,确认环境变量加载正常,settings里的DEFAULT_FILE_STORAGE确实指向了Cloudinary的存储类,但实际生效的default_storage还是本地的FileSystemStorage:
>>> 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'>
现在的情况是,如果我在每个ImageField里手动指定storage参数,比如这样:
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() )
文件就能正常上传到Cloudinary,但我不想给每个模型的每个媒体字段都手动加这个配置,有没有办法让DEFAULT_FILE_STORAGE的设置真正生效呢?
内容来源于stack exchange




