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

Django项目部署到Heroku后media媒体文件无法显示如何解决

Django部署Heroku后media文件无法加载的解决方案

Heroku的临时文件系统是media文件无法加载的核心原因:dyno每次重启、部署、休眠都会清空本地存储的非静态文件,且Django默认不支持在生产环境直接提供media文件服务,和预编译好的static文件逻辑完全不同。

1 检查基础配置是否正确

  • 首先确认settings.py中media相关参数配置无误:
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
  • 确认项目根urls.py中已添加media路由(仅用于开发调试,生产环境不生效):
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        # 原有路由保持不变
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

注意:上述路由仅适用于DEBUG=True的开发环境,生产环境不要依赖Django本身提供媒体文件服务

2 配置第三方对象存储托管media文件

Heroku本身不支持持久化存储用户上传的media文件,需要对接第三方对象存储服务实现media文件的持久化访问,可通过django-storages实现对接:

  • 安装所需依赖:
    pip install django-storages boto3
    
    依赖安装完成后更新requirements.txt:
    pip freeze > requirements.txt
    
  • 在settings.py的INSTALLED_APPS中注册storages应用:
    INSTALLED_APPS = [
        # 原有应用保持不变
        'storages',
    ]
    
  • 添加生产环境存储后端配置,敏感参数通过Heroku的Config Vars进行管理,不要硬编码到代码中:
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    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 = os.environ.get('AWS_S3_REGION_NAME')
    AWS_DEFAULT_ACL = 'public-read'
    AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com'
    MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
    

3 部署验证

将修改后的代码推送到Heroku,重新上传测试媒体文件即可正常加载,文件会直接存储到对象存储中,不受Heroku dyno重启的影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:09:03