Django Channels报错:/ws/notification/ 404未找到,求排查解决
Django WebSocket实时通知系统404错误排查与解决
核心原因分析
出现Not Found: /ws/notification/错误,说明WebSocket请求未被ASGI服务器正确路由处理,以下是针对性排查和修复步骤:
1. 未使用ASGI兼容服务器运行项目
Django默认runserver是WSGI服务器,不支持WebSocket协议,必须用ASGI服务器启动项目:
- 安装daphne(Channels官方推荐的ASGI服务器):
pip install daphne
- 用daphne启动项目:
daphne reviewproject.asgi:application
或使用Channels提供的ASGI版本runserver:
python manage.py runserver --asgi
2. WebSocket路由正则未正确锚定
notification/routing.py中的正则表达式缺少开头锚点^,导致路由匹配逻辑异常:
修改routing.py:
from django.urls import re_path from . import consumers websocket_urlpattern = [ re_path(r'^ws/notification/$', consumers.NotificationConsumer.as_asgi()), ]
添加^确保只匹配以/ws/notification/开头且结尾的路径。
3. ASGI配置文件路径或引用错误
确认settings.py中的ASGI_APPLICATION配置与实际文件路径一致:
ASGI_APPLICATION = "reviewproject.asgi.application"
同时检查asgi.py中是否正确导入WebSocket路由:
import notification.routing # 确保URLRouter引用的是正确的变量名 URLRouter( notification.routing.websocket_urlpattern )
注意变量名是websocket_urlpattern(单数),如果routing.py中是复数websocket_urlpatterns需同步修改。
4. 避免HTTP路由与WebSocket路由冲突
检查项目根urls.py中是否存在匹配/ws/notification/的HTTP路由,若有需删除或修改,防止WebSocket请求被HTTP路由拦截处理。
额外优化提示
consumer.py中group_discard方法不存在,Channels正确的移除组方法是group_remove,修改代码:
async def disconnect(self): await self.channel_layer.group_remove(self.group_name, self.channel_name)
内容的提问来源于stack exchange,提问作者Yasumi
相关产品推荐
相关产品推荐

