Heroku部署Django Web应用时静态文件及collectstatic相关报错问题咨询
Django项目Heroku部署collectstatic阶段FileNotFoundError解决方案
报错根因
报错抛出的No such file or directory: '/tmp/build_xxxx/static',是Heroku执行构建脚本运行python manage.py collectstatic --noinput时,找不到STATICFILES_DIRS配置指向的静态源目录导致的。Heroku构建环境只会同步你Git仓库中被跟踪的文件,存在本地但未提交、被.gitignore排除的目录不会出现在构建路径下,就会触发文件找不到的错误。
排查与修复步骤
- 校验静态源目录的Git跟踪状态
当前settings.py中配置的源静态目录为os.path.join(BASE_DIR, 'static'),即项目根路径下的static文件夹:- 执行
git ls-files | grep ^static/检查Git仓库内是否跟踪了该目录下的文件 - 如果查询无结果,检查项目根目录的
.gitignore文件,删除其中对static/、staticfiles/路径的忽略规则 - 执行
git add static/将源静态目录加入暂存区,完成提交后重新推送到Heroku远端
- 执行
- 补全WhiteNoise缺失配置
目前已在中间件列表中引入whitenoise.middleware.WhiteNoiseMiddleware,还需要在settings.py的静态配置块末尾补充存储配置,否则静态资源的缓存、压缩逻辑无法正常运行:
同时确认STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'requirements.txt中已明确声明依赖版本,避免构建时出现包缺失:
当前Procfile的配置whitenoise==6.2.0 gunicorn==20.1.0web: gunicorn portfolio.wsgi --log-file -符合Heroku Python应用的启动要求,不需要额外修改。 - 修正路径配置冲突
之前尝试将STATIC_ROOT设置为static目录是完全错误的配置方向:STATIC_ROOT是collectstatic命令收集所有静态文件后生成的输出目录,路径绝对不能和STATICFILES_DIRS指向的源静态目录重合,否则会出现路径嵌套、循环引用的问题。
保持原有配置STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')即可,只要STATICFILES_DIRS指向的源目录正确同步到构建环境,collectstatic就可以正常运行。 - 本地前置校验
推送代码到Heroku前,先在本地运行python manage.py collectstatic --noinput,确认本地可以无报错生成staticfiles目录,即可排除代码层面的路径配置错误。
注意:不建议直接使用报错提示中给出的
heroku config:set DISABLE_COLLECTSTATIC=1作为最终解决方案。该操作仅会临时关闭静态文件收集流程,会导致生产环境下网站的CSS、JS资源全部加载异常,仅适合临时调试使用,不能作为正式上线的配置。
内容的提问来源于stack exchange,提问作者Muzaffarbek Muratov
相关产品推荐
相关产品推荐

