You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku部署Django站点配置AWS后静态文件丢失,如何实现静态文件留Heroku、上传文件存AWS

配置错误根因

你当前的问题来自三个核心配置错误:

  • 错误将静态文件存储后端也设置为S3,导致原本Heroku上的静态文件全部转向S3请求,自然加载失败
  • 没有显式配置AWS_S3_REGION_NAME参数,django-storages的S3后端生成资源URL时不会自动带上区域,你手动拼接STATIC_URL不会生效
  • 媒体文件的存储后端选择错误,S3StaticStorage是专门适配静态文件的后端,用户上传的媒体文件应该用S3Boto3Storage

正确配置方案

你只需单独修改用户上传媒体文件的存储配置,静态文件保持Heroku原生配置即可。

1. 还原静态文件的Heroku配置

静态文件直接用Heroku常用的whitenoise处理即可,不要关联S3:

# 如果你安装了whitenoise(Heroku部署Django标准配置)
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# 未安装whitenoise就用Django默认配置
# STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

# 还原为你之前正常运行时的静态文件地址
STATIC_URL = '/static/'

2. 单独配置媒体文件走S3存储

补全S3的必要参数,不要手动拼接域名,让框架自动生成正确的资源地址:

# AWS S3基础配置
AWS_ACCESS_KEY_ID = os.environ.get('你的AWS_ACCESS_KEY环境变量名')
AWS_SECRET_ACCESS_KEY = os.environ.get('你的AWS_SECRET_KEY环境变量名')
AWS_STORAGE_BUCKET_NAME = '你的S3桶名称'
# 显式指定桶所在区域,框架生成URL时会自动带上该参数
AWS_S3_REGION_NAME = 'eu-west-1'
AWS_QUERYSTRING_AUTH = False
# 可选配置:给所有上传的媒体文件加统一前缀,方便桶内文件管理
# AWS_LOCATION = 'media'

# 仅修改用户上传文件的默认存储后端
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# 媒体文件URL可由框架自动生成,也可按规则手动配置
MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com/'

3. 排查S3访问权限

如果配置后仍无法加载媒体文件,检查S3桶配置:

  • 确认桶的访问策略允许对应密钥有s3:GetObject、s3:PutObject权限
  • 公开访问的媒体文件需要关闭桶的「阻止所有公开访问」开关,或配置对应的公开访问策略
  • 可先手动拼接一个已上传文件的URL在浏览器打开,确认S3本身可正常访问后,再排查Django侧配置

内容的提问来源于stack exchange,提问作者VaultDweller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:09:03