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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:36:03