部署Django到Heroku报todo.wsgi缺失的ModuleNotFoundError解决方法
部署报错排查与修复方案
你遇到的ModuleNotFoundError: No module named 'todo.wsgi'报错,本质是部署时的文件结构和配置预期不匹配,不是gunicorn配置本身的问题,按以下步骤逐点排查即可解决:
最常见的触发原因
- Procfile放置位置错误
Heroku启动应用时,只会从git仓库的根目录读取Procfile配置,不会递归扫描子文件夹里的同类文件。你当前把Procfile放在了todo文件夹内部,意味着推送到远端的代码里,仓库根目录下根本没有可识别的Procfile。这种情况下Heroku会走内置的Python应用启动逻辑,而非你配置的gunicorn命令,路径不匹配就会触发找不到wsgi模块的报错,最终触发dyno崩溃、H10错误和503响应。正确要求:Procfile必须和项目的
manage.py文件处于同一层级(也就是git仓库的根目录),不能放到内层的项目包目录下。 - git推送的文件缺失关键内容
本地目录看起来存在todo文件夹,不代表推送到Heroku的代码包里是完整的:
很多开发者会误将todo/__init__.py、todo/wsgi.py这类文件写进.gitignore,或是调整目录结构后没有重新提交变更,导致推到远端的todo文件夹是空目录——Python不会将缺少__init__.py的普通文件夹识别为可导入的Python包,自然会抛出找不到todo.wsgi模块的错误。
你可以部署后通过heroku run bash进入dyno的运行环境,逐目录核对:- 根目录下是否存在
manage.py - 根目录下的todo文件夹内,是否有
wsgi.py和__init__.py两个核心文件
- 根目录下是否存在
- 嵌套路径不匹配
如果你git初始化的层级和文件实际存放的层级错位,会直接导致gunicorn找错模块位置:
举个典型的错位场景:你本地的git仓库根目录在最外层的总文件夹,内层嵌套了一层放manage.py的todo目录,真正带wsgi.py的项目包又放在这层todo目录里面。这种情况下,gunicorn在仓库根目录执行gunicorn todo.wsgi:application时,会找根目录下的todo文件夹(也就是那个放manage.py的外层目录),这个目录里根本没有wsgi.py文件,自然会报模块找不到——这也是为什么你本地看起来todo文件夹真实存在,部署却识别失败的核心原因。
快速修复流程
- 将Procfile从内层todo目录挪到和
manage.py同层级的仓库根目录 - 检查
.gitignore规则,确保__init__.py、wsgi.py、manage.py、Procfile都不会被git过滤 - 重新执行提交推送:
git add . && git commit -m "fix deploy file path" && git push heroku <你的部署分支名> - 推送完成后执行
heroku logs --tail观察启动日志,确认gunicorn能正常加载wsgi模块启动worker进程,之前的dyno崩溃、H10访问错误就会自动恢复。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

