采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
您在这节课上提到
每两个用户之间都有私信,所以每两用户的组,也要唯一
但是,如果用户A,先后发起了两个私信聊天请求,那么按照您对组的命名方法(self.scope[‘user’]),就会存在两个相同的组名,这个地方我不太理解,求解答。
您好,这里的确是有设计缺陷。假设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”
非常感谢!
我后来想了一下,私信这一部分您的代码其实是没问题的,不存在窃听问题。因为消息这部分的websocket连接是在进入私信页面就已经建立了,不是在点击聊天时建立的,此时用户对应的consumer和group已经生成了,无论是C给A B发消息,都只会把消息发给A B所在组,而这些组都是以自己的用户名命名,都是唯一的,所以不存在消息内容被偷听的风险,有窃听风险的是您在notification中的内容,您直接建立了一个notifications组,然后只要有消息全推送给在线用户,这部分逻辑应该就是您给我回复的那个过程。
另外,我想问下,如果C跟A发送消息,而A没有进入私信页面建立websocket连接,这时channels是怎么处理这种情况的?
真细心,你是对的。其实这里反过来理解就容易了,关键看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方法不会被调用
登录后可查看更多问答,登录/注册
融合Django高级用法/算法/设计模式/TestCase测试/云计算打造项目
2.5k 15
7.5k 1
2.3k 6
1.6k 4
1.8k 2