django-channels如何向组内特定成员推送信息的解决方案
测试版本:
python 3.8
djnago 3.2
channels 3.0
需求
向channels的小组内某(些)个特定成员推送信息,而不是向组内所有人员群发
实现原理
websocket 三件套(scope, receive, send),其中send
是一个已经绑定客户端的信息发送函数,我们只需要建立一个类似这样的字典>>> send_dict = {'uid':send}
,就可以向任意一个特定的客户端推送信息,方式如同:send_dict['uid']({'type': 'websocket.send', 'text': json.dumps(Object)})
实现方式
在views中具体处理websocket的方法里
点击查看代码
# views.py
from channels.generic.websocket import AsyncWebsocketConsumer
send_dict = {}
class Connect(AsyncWebsocketConsumer):
async def connect(self):
# 想办法获取该客户端的唯一身份标识,比如 UID
uid = XXXX
self.uid = uid
# 获取客户端将要加入的分组名称
group_name = XXXX
self.room_group_name = f'channel_{group_name}'
# Join room group
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
# 将该客户端的信息发送函数与客户端的唯一身份标识绑定,保存至自定义的字典中
try:
send_dict[self.room_group_name][self.uid] = self.send
except KeyError:
send_dict[self.room_group_name] = {}
send_dict[self.room_group_name][self.uid] = self.send
print('建立连接')
# 建立连接
await self.accept()
async def disconnect(self, close_code):
# 删除 send_dict 中对应的信息
del send_dict[self.room_group_name][self.uid]
# Leave room group
await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
print("连接关闭")
await self.close(close_code)
async def receive(self, text_data=None, byte_text_data=None):
try:
text_data_json = json.loads(text_data)
except Exception as e:
print('数据无法被json格式化', e)
await self.disconnect(400)
else:
# 获取将要推送信息的目标身份标识,调用保存在 send_dict中的信息发送函数
target_uid = XXXX
await send_dict[self.room_group_name][target_uid](text_data=json.dumps(text_data_json))
效果展示
发送:
接收:
django-channels如何向组内特定成员推送信息的解决方案的更多相关文章
- 关于iOS特定设别推送(特定用户推送)【原】
在这里,我就不哆嗦如何制作推送证书之类的了,网上一搜一大堆. 我们现在很多开发者的推送,就是集成第三方的推送SDK,然后通过第三方的推送平台帮我们进行推送.其实,这种推送(如JPush),一般只能广播 ...
- 通向高可扩展性之路(推特篇) ---- 一个推特用来支撑1亿5千万活跃用户、30万QPS、22MB每秒Firehose、以及5秒内推送信息的架构
原文链接:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active ...
- WebSocket实现站内消息实时推送
关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...
- MySQL实现分组取组内特定数据的功能
需求:在MySQL5.7环境下,查询下面表中,各个学科前两名的学生的成绩: 1.准备数据 窗机表以及向表中插入数据 创建一张表: DROP TABLE IF EXISTS `grade`; CREAT ...
- 由内搜推送思考Kafka 的原理
刚入公司的两周多,对CDX项目有了进一步的认识和理解,在这基础上,也开始了解部门内部甚至公司提供的一些中间服务.CDX项目中涉及到的二方服务和三方服务很多,从之前写过的SSO,Auth,到三方图库的各 ...
- $Django 支付宝支付,微信服务号推送消息 (测试需要把应用程序部署到服务器上)
一 支付宝支付 大概 支付宝支付 正式环境:需要用营业执照去申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.ht ...
- Linux 根据组名查询出该组内所有成员
目前linux中没有直接根据组名查询组员的命令. 目前系统提供的查找组员和组之间的关系的方法有两种, 一种是:查找/etc/passwd和/etc/group目录,根据/etc/group目录里面的组 ...
- 实时 Django 终于来了 —— Django Channels 入门指南
Reference: http://www.oschina.net/translate/in_deep_with_django_channels_the_future_of_real_time_app ...
- Django Channels 入门指南
http://www.oschina.NET/translate/in_deep_with_django_channels_the_future_of_real_time_apps_in_django ...
- 【翻译】Django Channels 官方文档 -- Tutorial
Django Channels 官方文档 https://channels.readthedocs.io/en/latest/index.html 前言: 最近课程设计需要用到 WebSocket,而 ...
随机推荐
- Hive - [02] 安装部署
一.相关链接地址 Hive官网:https://hive.apache.org/ Hive下载页面:https://downloads.apache.org/hive/ 中科大镜像地址:http:// ...
- OERV兴趣探索:模拟器移植
最近看了很多开源项目,主要都集中在模拟器方面,我指的是游戏模拟器比如GameBoy或者PlayStation这一类.现在想玩这系列的游戏可以在手机或者电脑下载相应的模拟器,并且获取对应的ROM文件 ...
- FormCreate中在事件中获取api
form-create中在事件中获取api FormCreate 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持5个UI框架,并且支持生成任何 Vue 组件. ...
- Web前端入门第3问:前端需要学习哪些技术?
Web前端开发技术学习路径 基础知识 必备 HTML+CSS+JavaScript ,就目前来看,这三板斧是入门前端开发的门槛,无论如何都是逃不掉了. 进阶知识 必须会一门主流的前端框架,比如:Rea ...
- VitePress全局组件封装
前言 VuePress 主题默认有 <CodeGroup> 组件用于切换代码很方便. 如图所示: 痛点 使用 VitePress 后,官方没有提供 <CodeGroup> 组件 ...
- EmlBuilder:一款超轻量级的EML格式电子邮件阅读和编辑工具
EmlBuilder 是一款超轻量级的电子邮件阅读和编辑工具,针对EML格式的文件具有非常强大的解析和容错能力,可实现超文本邮件的编写,并具备内嵌图片的编辑功能.该工具内部使用EmlParse对电子邮 ...
- 编写你的第一个 Django 应用程序,第2部分
接着上次第1部分开始,现在我们将设置数据库,创建您的第一个模型,并快速获得 介绍 Django 自动生成的管理站点. 一.数据库设置 现在,打开.这是一个普通的 Python 模块,具有 表示 Dja ...
- Mac 刷题环境配置
Mac 刷题环境配置 这篇博文主要记录自己为了更方便的在 Mac 上写算法题,主要是基于 Clion做的一些环境配置:有些操作其实在 Windows ,Linux 下也是通用的,如果看到的小伙伴也可以 ...
- 【Linux】3.2 vi和vim编辑器
vi 和 vim 三种模式的相互转化图 vim 和 vi 的快捷键键盘一览图 vi和vim编辑器 1. vi和vim的基本介绍 所有Linux系统都会内置vi文本编辑器 vim是vi的升级版,可以主动 ...
- C# using 别名
场景重现 当using的多个库出现类名重复的情况时... 解决办法 使用类的完全限定名称,例如: // 不需要using,避免using名称重复导致的异常 // 使用类的完全限定名称,俗称全名. Sy ...