You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django项目无法切换默认文件存储为Cloudinary媒体存储的问题求助

Django项目无法切换默认文件存储为Cloudinary媒体存储的问题求助

大家好,我最近在开发一个Django项目,本地存储媒体文件的功能一切正常,但决定改用Cloudinary托管媒体文件后遇到了棘手问题——明明在配置里设置了默认文件存储为Cloudinary的媒体存储,可上传的文件还是会存在本地。

以下是我的相关配置和调试信息:

1. settings.py 配置

我已经在INSTALLED_APPS中添加了cloudinary_storagecloudinary,配置了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

火山引擎 最新活动