Channels集成到Django消息实时推送
channel架构图

InterFace Server:负责对协议进行解析,将不同的协议分发到不同的Channel
Channel Layer:频道层,可以是一个FIFO队列,通常使用Redis
Django中配置Channel:
CHANNEL_LAYERS的配置:
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": ["redis://127.0.0.1:6379", ],
},
},
}
asgi的配置:
import os
import sys
import django
from channels.routing import get_default_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "web.settings_local")
django.setup()
application = get_default_application()
consumers代码:
class NotificationsConsumer(AsyncWebsocketConsumer):
"""处理通知应用中的WebSocket请求""" async def connect(self):
"""建立连接"""
if self.scope['user'].is_anonymous:
# 未登录用户拒绝连接
await self.close()
else:
await self.channel_layer.group_add(
'notifications', self.channel_name
)
await self.accept() async def receive(self, text_data=None, bytes_data=None):
"""将接收到的消息返回给前端"""
await self.send(text_data=json.dumps(text_data)) async def disconnect(self, code):
"""断开连接"""
await self.channel_layer.group_discard(
'notifications', self.channel_name
)
channels将同步的MySQL转换为异步的:
# ORM语句同步变异步,方式一
from channels.db import database_sync_to_async
user = await database_sync_to_async(User.objects.get(username=username)) # ORM语句同步变异步,方式二
@database_sync_to_async
def get_username(username):
return User.objects.get(username=username)
配置routing:
from django.urls import path
from channels.auth import AuthMiddlewareStack # channels的认证中间件
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator from notifications.consumers import NotificationsConsumer application = ProtocolTypeRouter({
'websocket': AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter([
path('ws/notifications/', NotificationsConsumer),
])
)
)
})
settings中配置:
INSTALLED_APPS中加入:
'channels',
配置ASGI_APPLICATION:
ASGI_APPLICATION = 'web.routing.application'
notifications 业务层实现逻辑:
channel_layer = get_channel_layer()
payload = {
'type': 'receive',
'key': key,
'actor_name': actor.username,
'id_value': id_value
}
async_to_sync(channel_layer.group_send)('notifications', payload)
消息通知业务流程:
用户触发了消息 --> Django的view层 --> 保存到MySQL数据库 --> 将消息通知发送到channel对应的group里面 --> websocket将消息通过consumer推送给接收方
Channels集成到Django消息实时推送的更多相关文章
- 基于HTTP协议之WEB消息实时推送技术原理及实现
很早就想写一些关于网页消息实时推送技术方面的文章,但是由于最近实在忙,没有时间去写文章.本文主要讲解基于 HTTP1.1 协议的 WEB 推送的技术原理及实现.本人曾经在工作的时候也有做过一些用到网页 ...
- Django Channel实时推送与聊天
先来看一下最终的效果吧 开始聊天,输入消息并点击发送消息就可以开始聊天了 点击 “获取后端数据”开启实时推送 先来简单了解一下 Django Channel Channels是一个采用Django并将 ...
- spring boot 集成 websocket 实现消息主动推送
spring boot 集成 websocket 实现消息主动 前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单 ...
- dwr3+spring实现消息实时推送
最近项目要实现一个消息推送的功能,主要就是发送站内信或者系统主动推送消息给当前在线的用户.每次的消息内容保存数据库,方便用户下次登录后也能看到.如果当前用户在线,收到站内信就主动弹出提示.一开始想到的 ...
- WebSocket实现站内消息实时推送
关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...
- 利用socket.io实现消息实时推送
最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞.评论.关注等操作时,需要由服务器向用户实时地推送一条消息.最终完成的项目地址为:socket-message-push,这里 ...
- Asp.net SignalR 实现服务端消息实时推送到所有Web端
ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加 ...
- 基于swoole+Redis的消息实时推送通知
swoole+Redis将实时数据的推送 一 实现功能 设计师订单如果设计师未抢单,超时(5分钟)设计订单时时给设计师派送, 设计师公众号中收到派单信息 设计发布者收到派单成功信息 环境 centos ...
- php 消息实时推送(反ajax推送)
入口文件index.html <!DOCTYPE HTML> <html> <head> <title>反ajax推送</title> &l ...
随机推荐
- Code force-CodeCraft-20 (Div. 2) D. Nash Matrix 详解(DFS构造)
D. Nash Matrix time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...
- 字符串后面空字符的问题(char*与string的转换)
今天AC了不少题,困扰已久的Time limit error 也解决了,记住下次用STL容器的时候一定要清空容器. 其次是字符数组与字符串的浅谈. 字符数组是以'\0'结尾的,所以在字符数组赋值给字符 ...
- python json.dumps中ensure_ascii的使用,load与loads的区别
json模块最常用的两个功能: 一:json.dumps(),用于将dict拆分成str格式,称为序列化,注意序列化后,虽然print出来仍然显示的字典的样子,但是此时已经是str类型了. 其中,有时 ...
- 网络流 I - Fox And Dinner CodeForces - 510E
Fox Ciel is participating in a party in Prime Kingdom. There are n foxes there (include Fox Ciel). T ...
- 文件相关命令(find,tree,tar)文件属性信息 date
6.13day11 文件相关命令(find,tree,tar)文件属性信息date 1 文件相关命令 1.1 find命令 查找文件用f find /root -type f -name " ...
- js和jq的获取焦点失去焦点写法
- Android下拉刷新SwipeRefreshLayout简单用法
之前一直都想用下拉刷新,感觉上是庞大的工程,所以搁置了.现在学习了一下其实真的超级简单. 看了<第一行代码>以及 https://www.jianshu.com/p/3c402a9e4b7 ...
- Coursera课程笔记----P4E.Capstone----Week 4&5
Spidering and Modeling Email Data(week4&5) Mailing List - Gmane Crawl the archive of a mailing l ...
- Synchronized加锁、锁升级和java对象内存结构
首先了解一下JMM中定义的内存操作: 一个线程操作数据时候都是从主内存(堆内存)读取到自己工作内存(线程私有的数据区域)中再进行操作.对于硬件内存来说,并没有工作内存和主内存的区分,这都是java内存 ...
- dumpsys-package
dumpsys-package ams和pms是android系统最重要的系统服务,本文解析dumpsys package命令,看哪些PMS相关的系统信息,数据结构是运行时可以查看的. 命令提示 co ...