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
相关产品推荐
相关产品推荐

