Gunicorn启动工厂模式Flask应用报HaltServer错误如何解决
报错根因
启动失败是两个问题导致的:
- Gunicorn的启动参数
wsgi:app要求从wsgi模块中加载名为app的WSGI可调用对象,但你的wsgi.py中根本没有定义名为app的变量,只有导入的自定义包装类实例a。 - 你写的
FlaskAppWrapper类实例本身不是符合WSGI规范的可调用对象,Gunicorn无法直接运行它,真正的Flask应用实例是存放在这个包装类app属性里的原生Flask对象。
修复步骤
- 首先修改wsgi.py,正确暴露Gunicorn需要的原生Flask实例,修改后内容如下:
from main import a # 导出符合WSGI规范的Flask原生实例,和启动参数里的对象名对应 app = a.app if __name__ == "__main__": a.run()
- 补全路由配置:你当前代码中只注册了
/data的POST接口,returning_action对应的首页路由没有注册,如果需要访问首页,在main.py中实例化a之后补加路由即可:
a = FlaskAppWrapper('wrap') # 补加首页GET路由 a.add_endpoint(endpoint='/', endpoint_name='index', handler=returning_action, t_methods=["GET"]) a.add_endpoint(endpoint='/data', endpoint_name='data', handler=action, t_methods=["POST"])
- 直接使用原来的启动命令即可正常启动:
gunicorn -w 4 wsgi:app
如果你不想修改wsgi.py,也可以直接在启动命令里指定正确的对象路径:
gunicorn -w 4 "wsgi:a.app",但这种写法可读性差,不推荐在生产环境使用。
验证方法
服务启动后默认监听8000端口,可以通过curl测试POST接口是否正常响应:
curl -X POST -H "Content-Type: application/json" -d '{"msg":"test"}' http://127.0.0.1:8000/data
接口正常的话会返回字符串OK。
内容的提问来源于stack exchange,提问作者Mahesh Manjunath
相关产品推荐
相关产品推荐

