关于consumer websocket组名命名的问题
来源:9-11 Generic Consumers同步与异步通信
evilchaos
2020-06-18
您在这节课上提到
每两个用户之间都有私信,所以每两用户的组,也要唯一
但是,如果用户A,先后发起了两个私信聊天请求,那么按照您对组的命名方法(self.scope[‘user’]),就会存在两个相同的组名,这个地方我不太理解,求解答。
2回答
-
您好,这里的确是有设计缺陷。假设A发起和B私信聊天请求,又发起和C私信聊天请求,按照
self.channel_layer.group_add(self.scope['user'].username, self.channel_name)
A, B, C三个人都在一个聊天室了。但课程里的私信功能,之所以A给B发消息时C没有收到,因为前段JS这么写了
实际上A和B之前的私信在后台跑了一圈后也发给C了,按照这个缺陷,私信内容有能被C偷听的风险... o(╥﹏╥)o
所以正确的做法的确是要每两个用户的组名唯一,比如channels文档给的demo
组名规律可以自己设计,比如 A B的username排序后“username1-username2”
032020-06-21 -
Jack
2020-06-23
真细心,你是对的。其实这里反过来理解就容易了,关键看messager/views.py中的这里
A给B发消息,是发到了组名为B的username,B在线的话(B有自己username的websocket连接),websocket js就能监听接收了
对于B发给A,反之同理。
如果A给B发,B没在线建立websocket连接的话,消息保存到数据库了,下次B点开页面时通过models.py中MessageQuerySet类中的方法获取,Consumer中的receive方法不会被调用
00
相似问题