Django应用部署到Heroku后新上传文件访问返回404问题求助
问题原因
- Heroku临时文件系统限制:Heroku的每个运行实例(dyno)都使用独立的临时文件存储,你通过Selenium下载存储到
media/books路径的文件,仅会保存在处理本次请求的dyno本地,只要dyno重启、重新部署、或是后续请求被分配到其他dyno,存储的文件就会被清空。本地开发时使用的是持久化的本地文件系统,所以不会出现该问题。 - Django生产环境默认不提供media文件服务:Heroku部署时通常会关闭DEBUG模式,此时Django不会自动处理MEDIA_URL对应的路由请求,就算文件暂时还存在,直接访问文件路径也会返回404。
- 配置遗漏:大概率没有在配置文件中正确声明MEDIA_ROOT、MEDIA_URL,也没有在路由中配置media资源的访问规则。
解决方案
1. 生产环境推荐方案:替换为第三方对象存储
Heroku的临时文件系统本身就不适合存储动态生成的用户资源,建议使用S3兼容的对象存储服务(如阿里云OSS、腾讯云COS等),配合django-storages库将FileField的存储路径直接指向对象存储,文件访问直接调用对象存储的公网链接,从根本上解决文件丢失和404问题:
- 安装依赖:
pip install django-storages boto3 - 按照你选用的对象存储官方文档,在settings.py中配置对应的存储后端即可。
2. 临时测试方案(仅适合调试,不可用于生产)
如果只是临时测试不想接入对象存储,可以先做如下配置:
- 在settings.py中补充media配置:
import os MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
- 在项目根urls.py中补充media路由适配,关闭DEBUG时也可正常访问media资源:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 此处保留原有路由配置 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
注意:该方案仅能临时生效,只要dyno重启所有存储的书籍都会被清空,且Django处理静态文件性能极低,生产环境禁止使用。
3. 额外检查项
- 确认
.gitignore文件没有过滤掉media目录,部署时该目录会被正常打包上传; - 检查Heroku环境中Selenium无头浏览器的配置是否正确,避免因为下载流程报错、文件根本没有生成导致的404;
- 确认Selenium下载流程没有触发Heroku的30秒请求超时限制,导致文件还没存储完成请求就被中断。
内容的提问来源于stack exchange,提问作者zahir 9
相关产品推荐
相关产品推荐

