Django使用channels进行消息推送
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进行消息推送相关推荐
- Django dWebScoket 实时消息推送
一.WebScoket是什么 WebSocket 是 HTML5 提供的一种浏览器与服务器间进行全双工通讯的协议.依靠这种协议可以实现客户端和服务器端 ,一次握手,双向实时通信.目前主流的浏览器都支持 ...
- channels实现websocket实时通讯和消息推送
Django+channels实现websocket实时通讯@channels Django框架集合channels实现实时通讯和消息推送 channel是Django团队的一个研发的一个给Djang ...
- Django实现微信消息推送
一 所需准备条件 微信公众号的分类 微信消息推送 公众号 已认证公众号 服务号 已认证服务号 企业号 基于:微信认证服务号 主动推送微信消息. 前提:关注服务号 环境:沙箱环境 沙箱环境地址: htt ...
- python websocket实现消息推送_python Django websocket 实时消息推送
[实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...
- 基于websocket的网页实时消息推送与在线聊天(上篇)
文章目录 @[toc] 基于websocket的网页实时消息推送与在线聊天(上篇) "使用dwebsocket在django中实现websocket" websocket原理图 d ...
- qhfl-9 微信模板消息推送
开发中用的是测试号 微信公众号认证流程 用户登陆 <!DOCTYPE html> <html lang="en"> <head><meta ...
- java后台 flex前台例子_flex+blazeds+java后台消息推送(简单示例)
现在有个问题需要大家思考一下,有个已经上线了的项目,有好好几千甚至上万的客户在使用了.现在项目开发商想发布一个通知.在今天下午6点需要重新启动服务器,想让在线的人在在预定的时间内都收到消息,让大家做好 ...
- Flex通过Blazeds利用Remoteservice与后台java消息推送
Flex通过Blazeds利用Remoteservice与后台java消息推送 准备工作:Myeclipse中先建立一个Web project工程,然后导入Blazeds的文件,再转换为Flex项目类 ...
- python 全栈开发,Day103(微信消息推送,结算中心业务流程)
python 全栈开发,Day103(微信消息推送,结算中心业务流程) 昨日内容回顾 第一部分:考试题(Python基础)第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事?- o ...
最新文章
- 2022-2028年中国抗菌不锈钢行业研究及前瞻分析报告
- 一本教我们如何避免糟糕设计的书
- 十 	mybatis逆向工程
- WEBMIN管理Centos5.2 or RedHat5.2以上版本时samba用户不能同步系统帐户
- linux cp命令强行覆盖复制
- Cython——[AttributeError: ‘MSVCCompiler‘ object has no attribute ‘compiler_so‘]解决方案
- [转载] NoSQL开篇——为什么要使用NoSQL
- [地球人]BlogEngine.NET[Appwo.com版]+采集器
- 运营商 sni 服务器,什么是服务器名称指示(SNI)
- 2W 字详解设计模式!
- ubuntu16.04安装opencv3.1.0(包含opencv_contrib模块)
- 简单手绘背景绘画过程-------树!
- 计算机病毒与反病毒技术
- rs485接口上下拉_通讯接口应用笔记1:RS485通讯上下拉电阻的选择
- 【基础】创建react脚手架
- python wmic_wmic linux python
- ps不更改原图比例,调整图片至任意尺寸
- python装在c盘、怎么换到d盘_怎么把安装在c盘的东西移到d盘_如何把c盘的应用程序移到d盘...
- 如何批量压缩图片?教你一键批量压缩图片的方法技巧
- 自然语言处理NLPIR-ICTCLAS 授权文件过期问题