Django ≥ 5.0 必须用 STORAGES 字典配置替代 DEFAULT_FILE_STORAGE,否则仍走本地;常见错误是版本不匹配导致配置失效。
直接配置
就能实现 Django 文件直传 OSS,但多数人卡在 403、bucket not found、endpoint 错配这三类错误上——不是代码写错,而是配置项没对齐
阿里云
控制台的实际状态。
为什么
配置后上传仍走本地?
最常见原因是 Django 5.0+ 引入了
字典配置,它会完全覆盖
。如果你用的是 Django ≥ 5.0,只设
是无效的。
检查 Django 版本:
Django ≥ 5.0 必须用:
Django DEFAULT_FILE_STORAGE 和
运行
后执行
,输出类名必须含
才算生效
和
怎么填才不报 403 或 bucket not found?
错误信息里其实已经告诉你答案了,只是很多人忽略。比如报错中出现
,说明你该用
,而不是随便抄个文档里的示例值。
必须和 Bucket 所在区域严格一致,格式为
,例如
必须和阿里云 OSS 控制台「Bucket 列表」里显示的**完整名称**一模一样(区分大小写、不能带路径)
如果控制台创建 Bucket 时选了「公共读」,但代码里设了
,上传成功但 URL 返回 403 —— 因为生成的签名 URL 默认按 private 权限签,而 public-read 的 bucket 不需要签名
临时调试可加
(空字符串),避免自定义域名解析或 HTTPS 配置干扰
上传后 URL 是签名链接还是公开链接?
取决于两个地方:Bucket 的 ACL 类型 + 是否启用了
。它不是由代码“生成”出来的,而是由 OSS 服务端策略决定的。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
且未设
:URL 形如
,无需签名,直接可访问
:URL 默认带签名参数(
),过期即失效
设了
且已正确 CNAME 解析到 OSS Endpoint:URL 变成
,但权限逻辑不变 —— public-read 才能裸访问,private 仍需签名
注意:
这个变量在部分旧版 fork 中存在,但
官方版不认它;强行加会导致 URL 拼接重复或 403
真正容易被忽略的点是:OSS 的 endpoint 区域、bucket 名称、ACL 类型这三项必须在控制台和 settings.py 里**三者完全对齐**,差一个字符或一个区域后缀都会导致静默失败或 403 —— 不要依赖“看起来差不多”,要用错误响应里的
或
字段反向确认。
DEFAULT_FILE_STORAGEDEFAULT_FILE_STORAGESTORAGESDEFAULT_FILE_STORAGEDEFAULT_FILE_STORAGEpython -c "import django; print(django.VERSION)"STORAGES = {
"default": {
"BACKEND": "aliyun_oss2_storage.backends.AliyunMediaStorage"
},
"staticfiles": {
"BACKEND": "aliyun_oss2_storage.backends.AliyunStaticStorage"
}
}STATICFILES_STORAGEpython manage.py shellfrom django.core.files.storage import default_storage; print(default_storage.__class__)AliyunMediaStorageEND_POINTBUCKET_NAMEHostId: xxx.oss-cn-hangzhou.aliyuncs.comoss-cn-hangzhou.aliyuncs.comEND_POINToss-.aliyuncs.com oss-cn-shanghai.aliyuncs.comBUCKET_NAMEBUCKET_ACL_TYPE = "private"ALIYUN_OSS_CNAME = ""ALIYUN_OSS_CNAMEBUCKET_ACL_TYPE = "public-read"ALIYUN_OSS_CNAMEhttps://.oss-.aliyuncs.com/ BUCKET_ACL_TYPE = "private"?Expires=...&OSSAccessKeyId=...ALIYUN_OSS_CNAME = "cdn.example.com"https://cdn.example.com/PREFIX_URLdjango-aliyun-oss2-storageHostIdEndpoint