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

Django Channels中self.scope['user']始终返回同一用户问题求助

问题根因

你遇到的self.scope['user']始终返回首个连接用户、消息无法群发的问题,核心错误出在routing.py的Consumer注册逻辑:你直接调用ChatConsumer()创建了Consumer实例,导致所有WebSocket连接共用同一个实例对象,实例的scope属性会被首个连接的用户数据覆盖,也无法为每个连接初始化独立的房间属性。

修复方案

1. 修正routing.py的Consumer注册逻辑

Channels要求注册Consumer时必须调用as_asgi()类方法为每个连接生成独立的实例,修改后的routing.py对应代码如下:

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    # 不要直接实例化ChatConsumer,调用as_asgi()方法
                    url(r"^messages/(?P<username>[\w.@+-]+)/$", ChatConsumer.as_asgi())
                ]
            )
        )
    )
})

2. 补充断开连接时的分组移除逻辑

你当前的websocket_disconnect方法没有将连接从聊天房间分组中移除,会导致后续分组广播时向无效连接发消息报错,修改consumer.py的对应方法:

async def websocket_disconnect(self, event):
    print("disconnected", event)
    # 从房间分组中移除当前连接
    await self.channel_layer.group_discard(
        self.chat_room,
        self.channel_name
    )

3. 可选检查项

如果修复后仍有问题,可确认两点:

  • settings.py中的CHANNEL_LAYERS配置是否正确指向WSL2中运行的Redis服务,注意WSL2默认防火墙需放开Redis端口允许宿主机访问
  • 两个测试用户是否进入了同一个线程房间,可打印thread_obj.id确认两个连接的chat_room值一致

内容的提问来源于stack exchange,提问作者some nooby questions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:27:03