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

Django Channels实现一对一聊天时Websocket连接失败与用户匹配查询不存在错误排查

问题修复方案

1. 「user matching query does not exist」& WebSocket连接错误修复

该错误根源于models.py第95行直接查询用户名时,目标用户不存在会抛出未捕获的异常,修改方式如下:

  • 打开models.py,找到ThreadManager类的get_or_new方法,修改第95行附近代码,捕获用户不存在异常:
# 替换原有 user2 = Klass.objects.get(username=other_username) 逻辑
try:
    user2 = Klass.objects.get(username=other_username)
except Klass.DoesNotExist:
    # 目标用户不存在时返回None,视图层会自动抛出404
    return None, False

修改后访问不存在的用户名对应的聊天页,会直接返回404而非500错误,WebSocket连接也可正常建立。

2. 消息无法实时推送修复

该问题存在两处核心代码错误:

错误1:消息创建模型调用错误

打开consumers.py,找到create_chat_message异步方法,你错误调用Thread.objects.create插入消息,实际应该使用ChatMessage消息模型:

@database_sync_to_async
def create_chat_message(self, me, msg):
    thread_obj = self.thread_obj
    me = self.scope['user']
    # 修正模型类为ChatMessage
    return ChatMessage.objects.create(thread=thread_obj, user=me, message=msg)

错误2:消息推送事件类型写错

打开consumers.py,找到chat_message方法,WebSocket发送消息的事件类型必须为websocket.send,之前错误写为chat_message导致前端收不到推送:

async def chat_message(self, event):
    print('message',event)
    await self.send({
        # 修正事件类型
        'type':"websocket.send",
        "text":event['text']
    })

额外检查项

确认settings.py中已经正确配置Redis Channel Layer:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("127.0.0.1", 6379)],
        },
    },
}

同时确保本地Redis服务已正常启动,否则群消息广播功能无法正常工作。

内容的提问来源于stack exchange,提问作者Raunak Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:09:01