Django使用gunicorn启动ASGI应用缺失send参数报错如何解决
错误原因
这个报错的核心原因是Gunicorn默认使用WSGI工作模式,而你启动的是符合ASGI协议的应用(因为集成了Channels处理WebSocket),两者的调用签名不匹配:
- WSGI应用要求
__call__(environ, start_response)两个入参 - ASGI应用要求
__call__(scope, receive, send)三个入参
Gunicorn默认的同步worker按照WSGI规则调用ASGI应用,缺少了必填的send参数,因此触发类型错误。
解决方法
分两种场景选择对应方案:
场景1:需要保留WebSocket/异步等ASGI特性
你需要搭配支持ASGI的worker启动,推荐使用Uvicorn作为Gunicorn的工作进程:
- 先安装依赖:
pip install uvicorn gunicorn - 修改启动命令,指定ASGI worker类型:
gunicorn --bind :8000 myproject.asgi:application -w 4 -k uvicorn.workers.UvicornWorker
参数说明:-w指定进程数,-k指定使用Uvicorn的ASGI工作进程。
如果不需要Gunicorn做进程管理,也可以直接用Uvicorn启动:uvicorn --host 0.0.0.0 --port 8000 myproject.asgi:application
场景2:不需要WebSocket/ASGI特性,仅需运行普通HTTP服务
你可以直接启动Django自带的WSGI应用即可,不需要调整依赖,修改启动命令为:gunicorn --bind :8000 myproject.wsgi:application
排查步骤
- 确认当前项目是否需要ASGI能力:如果集成了Channels、异步视图、Server-Sent Events等特性,必须使用ASGI服务器启动
- 检查启动命令是否正确指定了ASGI worker类型,避免使用Gunicorn默认的WSGI worker
- 先单独用Uvicorn启动ASGI应用验证应用本身是否正常,排除配置错误问题
- 确认运行环境中uvicorn、gunicorn、channels、Django的版本兼容,避免版本冲突
内容的提问来源于stack exchange,提问作者Sultan Syidaliev
相关产品推荐
相关产品推荐

