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

