Django使用channels进行消息推送

说明

  • 这个只是说了Django后端的搭建,前端我就不讲了,
  • 可以使用这个网站进行测试
  • http://www.websocket-test.com/

环境

  • Django3.1
  • Python3.7
  • Redis 必须使用5.0 以上

安装包

  • Django环境搭建自己搭去

  • 安装channels

    pip install -U channels

  • 在这里,我们使用redis做为channels的通道后端,以便支持更多的功能

    pip install channels_redis

  • dwebsocket 安装这个可以用原生的写法

    pip install dwebsocket

配置

# setting.py
# 添加应用
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','Your-app','channels', # 添加的channels应用,固定写发
]# 新增的配置,固定写法
CHANNEL_LAYERS = {"default": {"BACKEND": "channels_redis.core.RedisChannelLayer","CONFIG": {"hosts": [('127.0.0.1', 6379)],},# 配置路由的路径# "ROUTING": "exmchannels.routing.channel_routing",},
}
# 下面是要根据自己的写路由的位置来确定的
ASGI_APPLICATION = 'apps.blog.routing.application'

起步

  • 在你的应用中创建两个文件

    • routing.py (相当Django的urls,当然你可以换成你想要的名字)
    • consumers.py (=views.py)
  • 路由配置

    # apps/blog/routing.py
    from channels.routing import ProtocolTypeRouter, URLRouter
    from channels.auth import AuthMiddlewareStack
    from django.urls import path
    # ------
    from apps.blog.consumers import ChatConsumer
    # ChatConsumer是你创建的视图
    # 这个位置的application就是你在setting中配置的
    application = ProtocolTypeRouter({# Empty for now (http->django views is added by default)'websocket': AuthMiddlewareStack(URLRouter([path('mes', ChatConsumer.as_asgi()), # 这个配置就像路由配置,没有什么区别])),
    })

视图

# apps/blog/consumers.py
import json
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
from channels.layers import get_channel_layer
from django.http import HttpResponseclass ChatConsumer(WebsocketConsumer):# connect disconnect receive 是固定写法def connect(self):# self.scope 这个里面有很多参数,可以自己打印出来看看,然后找到自己想要的self.room_name = self.scope['url_route']['kwargs'].get('room_name', 'room_name')# room_group_name 这个是一个分组,最好你主动推送时是要用到这个名字的,所以这个名字命名一定要有点规则,需要注意的是,这个分组里面是可以放多个连接的,然后推送时,会推送到这个组里面所有用户self.room_group_name = 'chat_%s' % self.room_name# 固定写法,加入组,如果组已存在,则加入,不存在,则先创建后加入async_to_sync(self.channel_layer.group_add)(self.room_group_name,self.channel_name)# 开启连接self.accept()def disconnect(self, close_code):# 断开连接时调用async_to_sync(self.channel_layer.group_discard)(self.room_group_name,self.channel_name)# Receive message from WebSocketdef receive(self, text_data):# 接受客户端的信息,你处理的函数text_data_json = json.loads(text_data)message = text_data_json['message']# Send message to room groupasync_to_sync(self.channel_layer.group_send)(self.room_group_name,{'type': 'chat_message','message': message})# Receive message from room groupdef chat_message(self, event):# message = event['message']# Send message to WebSocketself.send(text_data=json.dumps({'message': '我是主动发送'}))# 这个是主动推送的关键,一定要写成一个函数,然后在调用
def push(username, event):""":param username: 上面定义的组的名字:param event: 你要返回的消息内容,可以是str,dict:return: """channel_layer = get_channel_layer()async_to_sync(channel_layer.group_send)(username,{"type": "chat_message", # 这个就是你上面 ChatConsumer 定义的 chat_message方法"event": event # 是chat_message方法接受的参数})def mes_send(request):# 主动推送def push(username, event):push('chat_room_name', '我推送的信息')return HttpResponse()

到这里就结束了

写在最后

  • 如果还想比较一下,就可以去看着这个

    https://www.jb51.net/article/165580.htm

  • 官网

    https://channels.readthedocs.io/en/latest/index.html

Django使用channels进行消息推送相关推荐

  1. Django dWebScoket 实时消息推送

    一.WebScoket是什么 WebSocket 是 HTML5 提供的一种浏览器与服务器间进行全双工通讯的协议.依靠这种协议可以实现客户端和服务器端 ,一次握手,双向实时通信.目前主流的浏览器都支持 ...

  2. channels实现websocket实时通讯和消息推送

    Django+channels实现websocket实时通讯@channels Django框架集合channels实现实时通讯和消息推送 channel是Django团队的一个研发的一个给Djang ...

  3. Django实现微信消息推送

    一 所需准备条件 微信公众号的分类 微信消息推送 公众号 已认证公众号 服务号 已认证服务号 企业号 基于:微信认证服务号 主动推送微信消息. 前提:关注服务号 环境:沙箱环境 沙箱环境地址: htt ...

  4. python websocket实现消息推送_python Django websocket 实时消息推送

    [实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...

  5. 基于websocket的网页实时消息推送与在线聊天(上篇)

    文章目录 @[toc] 基于websocket的网页实时消息推送与在线聊天(上篇) "使用dwebsocket在django中实现websocket" websocket原理图 d ...

  6. qhfl-9 微信模板消息推送

    开发中用的是测试号 微信公众号认证流程 用户登陆 <!DOCTYPE html> <html lang="en"> <head><meta ...

  7. java后台 flex前台例子_flex+blazeds+java后台消息推送(简单示例)

    现在有个问题需要大家思考一下,有个已经上线了的项目,有好好几千甚至上万的客户在使用了.现在项目开发商想发布一个通知.在今天下午6点需要重新启动服务器,想让在线的人在在预定的时间内都收到消息,让大家做好 ...

  8. Flex通过Blazeds利用Remoteservice与后台java消息推送

    Flex通过Blazeds利用Remoteservice与后台java消息推送 准备工作:Myeclipse中先建立一个Web project工程,然后导入Blazeds的文件,再转换为Flex项目类 ...

  9. python 全栈开发,Day103(微信消息推送,结算中心业务流程)

    python 全栈开发,Day103(微信消息推送,结算中心业务流程) 昨日内容回顾 第一部分:考试题(Python基础)第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事?- o ...

最新文章

  1. 2022-2028年中国抗菌不锈钢行业研究及前瞻分析报告
  2. 一本教我们如何避免糟糕设计的书
  3. 十 mybatis逆向工程
  4. WEBMIN管理Centos5.2 or RedHat5.2以上版本时samba用户不能同步系统帐户
  5. linux cp命令强行覆盖复制
  6. Cython——[AttributeError: ‘MSVCCompiler‘ object has no attribute ‘compiler_so‘]解决方案
  7. [转载] NoSQL开篇——为什么要使用NoSQL
  8. [地球人]BlogEngine.NET[Appwo.com版]+采集器
  9. 运营商 sni 服务器,什么是服务器名称指示(SNI)
  10. 2W 字详解设计模式!
  11. ubuntu16.04安装opencv3.1.0(包含opencv_contrib模块)
  12. 简单手绘背景绘画过程-------树!
  13. 计算机病毒与反病毒技术
  14. rs485接口上下拉_通讯接口应用笔记1:RS485通讯上下拉电阻的选择
  15. 【基础】创建react脚手架
  16. python wmic_wmic linux python
  17. ps不更改原图比例,调整图片至任意尺寸
  18. python装在c盘、怎么换到d盘_怎么把安装在c盘的东西移到d盘_如何把c盘的应用程序移到d盘...
  19. 如何批量压缩图片?教你一键批量压缩图片的方法技巧
  20. 自然语言处理NLPIR-ICTCLAS 授权文件过期问题

热门文章

  1. 简析强制缓存和协商缓存
  2. pdf文档编辑(pdf编辑器)、pdf文档转换为word文档(pdf转换为word转换器)——Adobe Acrobat DC软件的下载与安装
  3. Ajax 跨域难题 - 原生 JS 和 jQuery 的实现对比
  4. 计算机内部逻辑基础,计算机逻辑基础
  5. Z transformation
  6. fastreport 横向分栏_FastReport开发指南.doc
  7. stackoverflow不能登入怎么办?
  8. Gitlab通过控制台重置密码及解锁用户
  9. Android 蓝牙 HFP 和 A2DP
  10. Button的onClick属性