请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于consumer websocket组名命名的问题

您在这节课上提到

每两个用户之间都有私信,所以每两用户的组,也要唯一

但是,如果用户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这么写了

https://img1.sycdn.imooc.com//szimg/5eec8a7109d078d800000000.jpg

实际上A和B之前的私信在后台跑了一圈后也发给C了,按照这个缺陷,私信内容有能被C偷听的风险... o(╥﹏╥)o

所以正确的做法的确是要每两个用户的组名唯一,比如channels文档给的demo

https://img1.sycdn.imooc.com//szimg/5eec8c0209dcd57006980257.jpg

组名规律可以自己设计,比如 A B的username排序后“username1-username2”

0 回复 有任何疑惑可以回复我~
  • 提问者 evilchaos #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-06-21 22:07:37
  • 提问者 evilchaos #2
    我后来想了一下,私信这一部分您的代码其实是没问题的,不存在窃听问题。因为消息这部分的websocket连接是在进入私信页面就已经建立了,不是在点击聊天时建立的,此时用户对应的consumer和group已经生成了,无论是C给A B发消息,都只会把消息发给A B所在组,而这些组都是以自己的用户名命名,都是唯一的,所以不存在消息内容被偷听的风险,有窃听风险的是您在notification中的内容,您直接建立了一个notifications组,然后只要有消息全推送给在线用户,这部分逻辑应该就是您给我回复的那个过程。
    回复 有任何疑惑可以回复我~ 2020-06-21 22:51:30
  • 提问者 evilchaos #3
    另外,我想问下,如果C跟A发送消息,而A没有进入私信页面建立websocket连接,这时channels是怎么处理这种情况的?
    回复 有任何疑惑可以回复我~ 2020-06-21 22:58:06
Jack 2020-06-23 00:09:07

真细心,你是对的。其实这里反过来理解就容易了,关键看messager/views.py中的这里https://img1.sycdn.imooc.com//szimg/5ef0d3e70914764107070204.jpg

A给B发消息,是发到了组名为B的username,B在线的话(B有自己username的websocket连接),websocket js就能监听接收了

https://img1.sycdn.imooc.com/szimg/5ef0d3180925b98d06810158.jpg

对于B发给A,反之同理。

如果A给B发,B没在线建立websocket连接的话,消息保存到数据库了,下次B点开页面时通过models.py中MessageQuerySet类中的方法获取,Consumer中的receive方法不会被调用

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信