测试版本:

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如何向组内特定成员推送信息的解决方案的更多相关文章

  1. 关于iOS特定设别推送(特定用户推送)【原】

    在这里,我就不哆嗦如何制作推送证书之类的了,网上一搜一大堆. 我们现在很多开发者的推送,就是集成第三方的推送SDK,然后通过第三方的推送平台帮我们进行推送.其实,这种推送(如JPush),一般只能广播 ...

  2. 通向高可扩展性之路(推特篇) ---- 一个推特用来支撑1亿5千万活跃用户、30万QPS、22MB每秒Firehose、以及5秒内推送信息的架构

    原文链接:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active ...

  3. WebSocket实现站内消息实时推送

    关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...

  4. MySQL实现分组取组内特定数据的功能

    需求:在MySQL5.7环境下,查询下面表中,各个学科前两名的学生的成绩: 1.准备数据 窗机表以及向表中插入数据 创建一张表: DROP TABLE IF EXISTS `grade`; CREAT ...

  5. 由内搜推送思考Kafka 的原理

    刚入公司的两周多,对CDX项目有了进一步的认识和理解,在这基础上,也开始了解部门内部甚至公司提供的一些中间服务.CDX项目中涉及到的二方服务和三方服务很多,从之前写过的SSO,Auth,到三方图库的各 ...

  6. $Django 支付宝支付,微信服务号推送消息 (测试需要把应用程序部署到服务器上)

    一 支付宝支付 大概 支付宝支付 正式环境:需要用营业执照去申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.ht ...

  7. Linux 根据组名查询出该组内所有成员

    目前linux中没有直接根据组名查询组员的命令. 目前系统提供的查找组员和组之间的关系的方法有两种, 一种是:查找/etc/passwd和/etc/group目录,根据/etc/group目录里面的组 ...

  8. 实时 Django 终于来了 —— Django Channels 入门指南

    Reference: http://www.oschina.net/translate/in_deep_with_django_channels_the_future_of_real_time_app ...

  9. Django Channels 入门指南

    http://www.oschina.NET/translate/in_deep_with_django_channels_the_future_of_real_time_apps_in_django ...

  10. 【翻译】Django Channels 官方文档 -- Tutorial

    Django Channels 官方文档 https://channels.readthedocs.io/en/latest/index.html 前言: 最近课程设计需要用到 WebSocket,而 ...

随机推荐

  1. Win系统重装备忘

    蒙德,致态的盘坏块激增,似乎损坏到了系统文件:屏幕截屏会卡,关机后直接该块硬盘内的文件内容回滚,出现驱动报错要求重启... 然后尝试了DiskGenuis迁移系统,PE模式不能用,热迁移后似乎正常分区 ...

  2. 【Unit1】表达式化简(层次化设计)-作业总结

    三次作业围绕表达式化简展开,逐次递进.主体思路为:递归下降解析表达式保存至类中,依据相关模式化简,依照规范输出字符串. 1.第一次作业 1.1 题目概述 表达式 = 项 + 项 + ... 项 = 因 ...

  3. 【Bug记录】[@vue/compiler-sfc] `defineProps` is a compiler macro and no longer needs to be imported.

    [Bug记录][@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported. Vue3项 ...

  4. 解决本地代理问题 git 或者 curl Failed to connect to 127.0.0.1 port 1087 after 8 ms: Connection refused

    问题出现原因 git配置了代理 本地配置了代理 执行这个命令可以看到自己的代理设置: env | grep -I proxy 临时更改代理 在当前终端执行以下命令,就可以临时将代理取消掉 export ...

  5. 分析 AIX 和 Linux 性能的免费工具。

    一.软件介绍1.分析工具nmon 工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新.这个高效的工具可以工作于任何哑屏幕.telnet 会话.甚至拨号线路.另外,它并不会消耗大量 ...

  6. 【Web】Servlet基本概念

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据, ...

  7. chatops

    ChatOps是什么? ChatOps, 简单地说,这是一种方法,允许团队以聊天室的方式来协作和管理其基础结构.代码和数据的许多方面.通过使用聊天机器人和脚本,团队可以执行命令.查询信息,并将知识分发 ...

  8. Redis的底层数据结构-跳表

    跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的.具有如下性质: 1.由很多层结构组成: 2.每一层都是一个有序的链表,排列顺序为 ...

  9. javaweb基础之HTTP、Request、Response、ServletContext

    一.http协议是一个重要的协议,他是贯穿整合B/S架构的核心协议.因此学习http协议的时候一定要从请求和响应两个角度思考.注意方向性(请求:浏览器->服务器:响应:服务器->浏览器) ...

  10. python,循环中加入等待时间,使每一次循环后随机等待一段时间

    爬虫爬取网页数据的时候,有时候因访问频率太过于规律导致被服务器发现,出现访问超时或者被封ip的情况.所以,每一轮爬取,后面加一个随时等待时间,可以减少被发现的概率 主要用到random和time库 实 ...