如何利用Django Channels构建实时聊天室及推送通知完整流程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计857个文字,预计阅读时间需要4分钟。
由于Django默认的runserver是WSGI服务器,它仅处理HTTP请求,不支持WebSocket或长连接。 Channels则需要走ASGI协议,否则consumers.py基本不会被调用,前端连接WebSocket时只会卡在pending状态。
实操建议:
- 必须用
daphne、uvicorn或hypercorn启动,例如:uvicorn myproject.asgi:application --reload -
asgi.py文件不能漏掉,且要确保application = ProtocolTypeRouter({ ... })包含"websocket"路由 - 开发时别改
settings.py里的WSGI_APPLICATION,它和 Channels 无关;关键看ASGI_APPLICATION是否指向正确路径
WebsocketConsumer 和 AsyncWebsocketConsumer 怎么选
同步 Consumer 会阻塞整个事件循环,只要一个客户端调用耗时操作(比如查数据库、发 HTTP 请求),其他所有连接都会卡住。除非你确定所有逻辑都是纯内存计算,否则默认用异步版本。
本文共计857个文字,预计阅读时间需要4分钟。
由于Django默认的runserver是WSGI服务器,它仅处理HTTP请求,不支持WebSocket或长连接。 Channels则需要走ASGI协议,否则consumers.py基本不会被调用,前端连接WebSocket时只会卡在pending状态。
实操建议:
- 必须用
daphne、uvicorn或hypercorn启动,例如:uvicorn myproject.asgi:application --reload -
asgi.py文件不能漏掉,且要确保application = ProtocolTypeRouter({ ... })包含"websocket"路由 - 开发时别改
settings.py里的WSGI_APPLICATION,它和 Channels 无关;关键看ASGI_APPLICATION是否指向正确路径
WebsocketConsumer 和 AsyncWebsocketConsumer 怎么选
同步 Consumer 会阻塞整个事件循环,只要一个客户端调用耗时操作(比如查数据库、发 HTTP 请求),其他所有连接都会卡住。除非你确定所有逻辑都是纯内存计算,否则默认用异步版本。

