Django配置对象存储后,图片未存入对象存储而是本地目录
问题:Django+DRF集成对象存储时图片仍存本地
我在基于Django、DRF和PostgreSQL的项目中集成对象存储,目标是通过API接口上传图片到对象存储,但调用接口执行上传操作时,图片却被存储在本地项目的base_dir/media目录下。PostgreSQL数据库中存储的是对象存储中的图片URL,但实际图片并未上传到对象存储。我已经检查过凭证、媒体文件和运行时值,重新配置设置也没解决问题。
模型代码
class Announcement(models.Model): image = models.ImageField(upload_to='media/')
当前boto3存储配置
AWS_ACCESS_KEY_ID = os.environ.get('DO_SPACES_KEY') AWS_SECRET_ACCESS_KEY = os.environ.get('DO_SPACES_SECRET') AWS_STORAGE_BUCKET_NAME = os.environ.get('DO_SPACES_BUCKET') AWS_S3_ENDPOINT_URL = os.environ.get('DO_SPACES_ENDPOINT') AWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400', } AWS_LOCATION = 'media' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] STATIC_URL = 'https://%s/%s/' % (AWS_S3_ENDPOINT_URL, 'static') MEDIA_URL = 'https://%s/%s/' % (AWS_S3_ENDPOINT_URL, AWS_LOCATION) STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
解决方案
- 你只配置了静态文件的存储后端,媒体文件的存储后端未指定,Django默认会使用本地存储。需要在配置中添加:
这样模型的DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'ImageField上传时才会调用S3存储后端。 - 注意路径重复问题:模型中
upload_to='media/'和配置里的AWS_LOCATION = 'media'会导致最终存储路径变成media/media/xxx.jpg,可以把模型里的upload_to改为空字符串或其他子目录,避免路径冗余。 - 确认环境变量正确加载:检查
DO_SPACES_KEY、DO_SPACES_SECRET等环境变量是否在运行环境中正确设置,若凭证为空,Django会自动 fallback 到本地存储。 - 调试验证:可以在视图或管理命令中打印配置值,比如
print(settings.DEFAULT_FILE_STORAGE),确认媒体存储后端是否正确设置为S3存储。
内容的提问来源于stack exchange,提问作者Raijin Taiyu
相关产品推荐
相关产品推荐

