部署到Heroku的Django应用静态文件返回404,本地DEBUG=False运行正常如何解决
问题原因
Django 在DEBUG=False的生产模式下默认不会提供静态文件服务,本地测试时即使关闭DEBUG也能正常访问静态文件,是因为runserver启动的开发服务器做了兼容处理,但Heroku上运行的是生产级WSGI服务器,不会自动处理静态资源。同时你配置的django_heroku.settings(locals(), staticfiles=False)也关闭了django-heroku库自带的静态文件自动处理逻辑,所以会返回404。
解决方案
按照以下步骤操作即可修复:
- 首先安装whitenoise,这是Heroku上处理Django静态文件的标准方案
执行命令:pip install whitenoise
安装完成后更新requirements.txt文件,把whitenoise的依赖加进去 - 修改
settings.py的中间件配置,把WhiteNoise中间件添加到列表的第二位,紧接在SecurityMiddleware之后:MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # 新增下面这行 'whitenoise.middleware.WhiteNoiseMiddleware', # 后面的原有中间件保持不变 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', ... ] - 你可以把配置末尾的
django_heroku.settings(locals(), staticfiles=False)中的staticfiles=False参数删除,或者直接保留也不影响whitenoise的正常工作 - 提交代码重新部署到Heroku,平台会自动执行
python manage.py collectstatic命令把所有静态文件收集到你配置的STATIC_ROOT目录下 - 如果部署后还是有问题,可以手动执行Heroku命令执行静态文件收集:
heroku run python manage.py collectstatic
额外提示:你的settings.py中先后两次定义了BASE_DIR,第一次用Path语法,第二次用os.path语法,虽然不影响静态文件加载,但建议统一写法避免后续其他配置出错
内容的提问来源于stack exchange,提问作者Guddi
相关产品推荐
相关产品推荐

