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
相关产品推荐
相关产品推荐

