You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Channels JWT认证WebSocket时触发无匹配路由报错

问题根因

抛出ValueError: No route found for path 'chat/chat_2/'的核心原因是WebSocket请求路径与路由配置不匹配:

  • 你在routing.py中配置的群聊路由规则为ws/chat/<str:room_name>/,个人聊天路由为ws/personal_chat/<str:room_name>/
  • 实际发起请求的路径是/chat/chat_2/,缺少了ws前缀,Channels的URLRouter匹配不到对应规则就会抛出该错误。

除此之外,你写的自定义JWT认证中间件还有两个隐藏问题,后续很容易触发连接异常,需要一并修复。

可行解决方案

1. 修正WebSocket请求地址

给请求路径补上缺失的ws前缀,群聊接口的正确请求格式如下:

ws://127.0.0.1:8000/ws/chat/chat_2/?token=替换为你的有效JWT令牌

如果调用个人聊天接口,对应路径为:

ws://127.0.0.1:8000/ws/personal_chat/你的房间名/?token=替换为你的有效JWT令牌

2. 修复JWT中间件的隐藏问题

当前中间件有两个容易触发报错的逻辑缺陷:

  • 直接通过下标取query参数里的token,如果请求没带token参数,会直接抛出KeyError导致连接无响应断开
  • token校验失败时直接return None,不会给客户端返回标准WS关闭帧,前端无法感知具体失败原因

修改middleware.py里JwtAuthMiddleware类的__call__方法,修复后代码如下:

async def __call__(self, scope, receive, send):
    # 关闭过期数据库连接
    close_old_connections()
    # 解析查询参数,兼容无token的场景
    query_params = parse_qs(scope["query_string"].decode("utf8"))
    token_list = query_params.get("token")
    if not token_list:
        scope["user"] = AnonymousUser()
        return await super().__call__(scope, receive, send)
    token = token_list[0]

    try:
        # 自动校验token合法性
        UntypedToken(token)
    except (InvalidToken, TokenError) as e:
        print(f"Token校验失败: {e}")
        scope["user"] = AnonymousUser()
        # 如果需要未认证直接拒绝连接,放开下面两行注释即可
        # await send({"type": "websocket.close", "code": 4001})
        # return
    else:
        # token合法则解析对应用户
        decoded_data = jwt_decode(
            token, settings.SECRET_KEY, algorithms=["HS256"]
        )
        scope["user"] = await get_user(validated_token=decoded_data)
    return await super().__call__(scope, receive, send)

3. 配置校验(可选检查)

你当前的asgi.py配置顺序是正确的:JwtAuthMiddlewareStack包裹URLRouter,所有WS请求会先经过认证逻辑再匹配路由,不需要调整。注意不要把URLRouter放在中间件外层,否则会出现先匹配路由再走认证的逻辑错误。

验证方式

修改完请求地址后重启Django服务,重新发起WS连接即可正常匹配路由,中间件会自动完成JWT校验,将对应用户对象写入scope["user"],后续在consumer中可以直接调用。

内容的提问来源于stack exchange,提问作者Ghassan Bourghle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:18:24