部署Quart应用至Heroku时遇TypeError错误求助
解决Quart部署Heroku时的TypeError问题
你遇到的这个错误核心原因是Quart是ASGI异步框架,而Gunicorn默认使用的同步worker(sync)是为传统WSGI应用(比如Flask)设计的,两者的调用签名完全不匹配:
- WSGI应用的
__call__方法接收2个参数:environ和start_response - ASGI应用的
__call__方法需要3个参数:scope、receive、send
Gunicorn默认的worker会把Quart的ASGI应用当成WSGI来调用,就会出现你看到的TypeError: __call__() takes 1 positional argument but 3 were(本质是调用签名不兼容导致的参数数量不匹配)。
下面是两种可行的解决方案:
方案一:用Gunicorn搭配ASGI兼容的Worker
这个方案保留Gunicorn作为进程管理器,同时使用支持ASGI的worker来运行Quart:
- 首先在你的
requirements.txt中添加uvicorn(Quart官方推荐的ASGI服务器):
quart>=0.18.0 gunicorn>=20.1.0 uvicorn>=0.20.0
- 修改你的
Procfile,指定使用uvicorn.workers.UvicornWorker:
web: gunicorn main_loop:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:$PORT
这里的-w 4是指定启动4个worker进程,你可以根据Heroku的dyno配置调整这个数字。
方案二:直接用Uvicorn启动应用
如果不需要Gunicorn的进程管理能力,也可以直接用Uvicorn作为服务器:
- 确保
requirements.txt包含uvicorn(同上) - 修改
Procfile为:
web: uvicorn main_loop:app --host 0.0.0.0 --port $PORT
另外补充一点:你本地用的app.run()是Quart自带的开发服务器,只适合本地调试,生产环境一定要用标准的ASGI服务器(比如Uvicorn)来部署,避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者Dup Dup
相关产品推荐
相关产品推荐

