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

Django本地可通过AWS加载媒体文件,部署到Heroku后失效如何解决?

修复Heroku部署后Django媒体文件从本地加载的问题

以下是针对问题的具体修复方案:

1. 调整django-heroku配置的执行顺序

你的settings.py中django_heroku.settings(locals())会自动覆盖部分存储相关配置,导致S3存储设置失效。解决方法是把S3存储的配置放在django-heroku初始化之后,或者在调用时排除存储配置:

方案A:调整代码顺序

修改settings.py,将S3相关配置移到django_heroku.settings(locals())之后:

# 先执行django-heroku初始化
django_heroku.settings(locals())

# 再设置S3存储配置,覆盖可能被修改的参数
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = 'eu-north-1'
AWS_S3_SIGNATURE_VERSION = 's3v4'
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

方案B:排除存储配置项

调用django_heroku.settings时,指定不覆盖存储相关设置:

django_heroku.settings(locals(), staticfiles=False)

2. 配置MEDIA_URL指向S3存储地址

当前MEDIA_URL = '/media/'会生成本地路径,需要改为S3存储桶的访问地址:

# 添加自定义域名配置(使用存储桶默认域名)
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com'
# 设置MEDIA_URL为S3的媒体文件路径
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'

3. 确认Heroku环境变量已正确设置

本地能加载是因为你本地环境有AWS密钥,但Heroku服务器需要手动配置这些变量:

  • 打开Heroku控制台,进入你的应用 → 设置 → 配置变量
  • 添加以下变量:
    • AWS_ACCESS_KEY_ID:你的AWS访问密钥ID
    • AWS_SECRET_ACCESS_KEY:你的AWS秘密访问密钥
    • AWS_STORAGE_BUCKET_NAME:你的S3存储桶名称

4. 确保依赖包已安装

检查requirements.txt中是否包含以下依赖,没有的话添加进去:

django-storages>=1.13.2
boto3>=1.24.0

5. 验证模板中的媒体文件引用

确保模板中使用的是{{ object.media_field.url }}这种方式生成URL,而不是硬编码的/media/xxx路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:53:16