跳转到主内容
极星编程网:以代码为星,赴技术山海!

Python Django怎么直传文件到阿里云OSS_配置storages远程后端

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

相关文章