关于consumer websocket组名命名的问题

来源:9-11 Generic Consumers同步与异步通信

evilchaos

2020-06-18

您在这节课上提到

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

但是,如果用户A,先后发起了两个私信聊天请求,那么按照您对组的命名方法(self.scope[‘user’]),就会存在两个相同的组名,这个地方我不太理解,求解答。

写回答

2回答

Jack

2020-06-19

您好,这里的确是有设计缺陷。假设A发起和B私信聊天请求,又发起和C私信聊天请求,按照

self.channel_layer.group_add(self.scope['user'].username, self.channel_name)

A, B, C三个人都在一个聊天室了。但课程里的私信功能,之所以A给B发消息时C没有收到,因为前段JS这么写了

//img.mukewang.com/szimg/5eec8a7109d078d800000000.jpg

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

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

//img.mukewang.com/szimg/5eec8c0209dcd57006980257.jpg

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

0
3
evilchaos
另外,我想问下,如果C跟A发送消息,而A没有进入私信页面建立websocket连接,这时channels是怎么处理这种情况的?
2020-06-21
共3条回复

Jack

2020-06-23

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

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

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

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

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

0
0

Django高级实战 开发企业级问答网站

融合Django高级用法/算法/设计模式/TestCase测试/云计算打造项目

900 学习 · 756 问题

查看课程