Heroku部署Django应用静态文件加载失败(404 Not Found)
解决Django部署Heroku后静态文件404的问题
我之前部署Django到Heroku时也踩过一模一样的静态文件坑!咱们一步步排查解决:
1. 必须配置Whitenoise托管静态文件
生产环境下Django默认不会处理静态文件的HTTP请求,Heroku上必须用Whitenoise来接管这项工作,这是最容易遗漏的关键点:
- 先安装Whitenoise:
记得把它加到pip install whitenoiserequirements.txt里,不然Heroku部署时会找不到这个依赖包。 - 在
settings.py的MIDDLEWARE列表里添加Whitenoise中间件,注意顺序要放在SecurityMiddleware之后,CommonMiddleware之前:MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # 这行必须加 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # ... 其他中间件保持不变 ] - 最后在
settings.py末尾加上静态文件存储配置:STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
2. 确认collectstatic执行无异常
虽然你说已经执行了collectstatic,但还是要确认在Heroku上没有报错:
- 运行Heroku命令重新执行文件收集:
查看输出有没有权限错误、文件找不到之类的提示,确保所有静态文件都被正确收集到heroku run python manage.py collectstatic --noinputSTATIC_ROOT指定的~/static目录下。
3. 检查DEBUG模式是否关闭
生产环境下必须把DEBUG设为False,否则Django会用开发模式处理静态文件,但Heroku的生产环境不支持这种方式:
- 查看当前Heroku的DEBUG配置:
heroku config:get DEBUG - 如果输出是
True,立刻改成False:heroku config:set DEBUG=False
4. 补充静态文件路由(可选但更保险)
在项目根目录的urls.py里添加静态文件的路由配置,确保生产环境下请求能被正确映射:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... 你的所有业务路由 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
5. 检查STATICFILES_DIRS配置(如果有自定义静态文件)
如果你的Django app里有自己的static文件夹(比如your_app/static),需要把它加到STATICFILES_DIRS里,这样collectstatic才能把这些文件收集到STATIC_ROOT:
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'your_app/static'), ]
做完这些步骤后,重新部署Heroku应用,再用你的curl命令测试,应该就能正常加载静态文件了!
内容的提问来源于stack exchange,提问作者Tinyik
相关产品推荐
相关产品推荐

