Flask Socket-IO部署Heroku遇Application Error求助
问题原因与解决方案
核心问题分析
从Heroku日志的报错ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi'可以明确两个关键问题:
- Procfile命令格式错误:你写的
web: gunicorn eventlet -w 1 app:app缺少指定worker类型的参数-k,gunicorn无法识别eventlet作为合法参数。 - 依赖版本不兼容:gunicorn 20.1.0的
geventletworker尝试导入eventlet 0.33.1中已被移除的ALREADY_HANDLED常量,两者版本不匹配导致冲突。
分步解决方案
1. 修正Procfile命令
将Procfile内容修改为正确格式,明确指定eventlet作为worker类:
web: gunicorn -k eventlet -w 1 app:app
2. 修复依赖版本冲突
选择以下两种方案之一调整requirements.txt:
方案A:升级gunicorn到兼容版本
将gunicorn的版本从20.1.0升级到21.0.0及以上,新版本修复了与eventlet 0.33+的兼容问题:
gunicorn>=21.0.0
方案B:降级eventlet到兼容版本
将eventlet的版本从0.33.1降级到0.32.0,该版本仍保留ALREADY_HANDLED常量:
eventlet==0.32.0
3. 优化依赖(可选)
你同时安装了eventlet和gevent两套异步库,可能引发潜在冲突,建议保留其中一套即可。如果使用eventlet,可移除以下依赖:
gevent==21.12.0 gevent-websocket==0.10.1
4. 重新部署并清理缓存
执行以下命令确保Heroku使用新依赖构建:
# 提交修改后的文件 git add requirements.txt Procfile git commit -m "Fix SocketIO deployment issues" git push heroku main # 清理Heroku构建缓存(解决旧依赖残留问题) heroku plugins:install heroku-builds heroku builds:cache:purge
内容的提问来源于stack exchange,提问作者ladsyf
相关产品推荐
相关产品推荐

