大模型应用
用 django-storages 把 Django…
在 Django 4.2+ 中通过 django-storages/boto3 将静态文件和媒体文件存储到 S3,并配置公共/私有后端、预签名 URL、CloudFront 与 IAM 策略。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 django-storages 把 特定
解决思路
- 安装并注册:执行 `pip install django-storages[s3] boto3`,并把 `"storages"` 加入 `INSTALLED_APPS`。
- 配置凭证:从环境变量读取,或依赖附加的 IAM role;绝不硬编码。
- 配置 `STORAGES` 字典:为 `default`(媒体)和 `staticfiles` 设置后端,并使用不同的 `location` 前缀。
- 按需添加命名后端:当需要区分公共与私有 bucket/ACL 时,在 `STORAGES` 中增加额外条目。
- 验证与测试:运行 `collectstatic`,确认上传落到 S3,并在测试中用 `InMemoryStorage` 或 `moto` mock S3。
- 审计凭证:`grep -rn "AWS_SECRET_ACCESS_KEY\|aws_secret" settings/`,确认值来自 `os.environ`/`django-environ` 或 IAM role,而不是提交到仓库的字面量。
- 审计 ACL:`grep -rn "default_acl\|AWS_DEFAULT_ACL" .`,对 2023 年 4 月之后创建的 bucket,所有值必须为 `None`;任何 `"public-read"`/`"private"` 都会触发 `AccessControlListNotSupported`,公共访问应放在 bucket policy 中。
- 审计存储后端:确认 Django 4.2+ 使用 `STORAGES` 字典,而不是 `DEFAULT_FILE_STORAGE`/`STATICFILES_STORAGE`(它们在 Django 5.1 被移除,在 5.1/5.2/6.0 上会被静默忽略);确认静态类为 `S3StaticStorage`,而不是编造的名称。
- 审计 location:确认 `default`(媒体)和 `staticfiles` 使用不同的 `location` 前缀或不同 bucket,避免 `collectstatic` 与上传冲突。
- 审计区域:确认 `region_name`(或全局 `AWS_S3_REGION_NAME`)与 bucket 实际区域一致,且对非 `us-east-1` bucket,`AWS_S3_CUSTOM_DOMAIN` 包含区域段。
- 审计预签名:对私有后端,确认 `querystring_auth=True` 且 `custom_domain=None`;确认预签名 `.url()` 结果不会缓存超过 `AWS_QUERYSTRING_EXPIRE`。
- 审计覆盖清理:在 `file_overwrite=False` 的地方,确认被替换的文件被显式删除,否则被取代的对象会泄漏。
- 审计 IAM:确认策略只授予 bucket ARN 上的 `Get/Put/Delete/ListBucket`,而不是更宽的 S3 权限。
- MUST DO:从环境变量或附加的 IAM role 加载 AWS 凭证。
- MUST DO:设置 `default_acl=None`,让 bucket policy(而非对象 ACL)控制访问。
- MUST DO:为静态和媒体文件提供不同的 `location` 前缀或不同 bucket。
- MUST DO:在 Django 4.2+ 使用 `STORAGES` 字典(同一配置适用于 5.2 LTS 和 6.0);`DEFAULT_FILE_STORAGE`/`STATICFILES_STORAGE` 在 5.1 被移除,仅保留给 < 4.2。
- MUST DO:在任何签发预签名 URL 的后端上设置 `custom_domain=None`。
- MUST DO:在测试中 mock S3(`InMemoryStorage` 或 `moto`),而不是访问真实 bucket。
- MUST NOT DO:在 `settings.py` 中硬编码 `AWS_SECRET_ACCESS_KEY` 或提交它。
- MUST NOT DO:把 `querystring_auth=True` 与 `custom_domain` 混用(预签名会失效)。
- MUST NOT DO:把静态和媒体文件放在同一前缀下。
- MUST NOT DO:给 IAM 用户授予超出 bucket ARN 上 `Get/Put/Delete/ListBucket` 的权限。
- MUST NOT DO:依赖 2023 年 4 月之后创建的 bucket 上的对象 ACL(默认禁用 ACL)。
适用边界 · 注意事项
- 不使用 AWS S3 或 django-storages,而是使用本地文件系统或其他对象存储时。
- 项目仍使用 Django < 4.2 且无法迁移到 `STORAGES` 字典时(需改用旧设置)。
- 无法提供 AWS 凭证、IAM role 或相应 bucket 权限时。