Channels集成到Django消息实时推送
2024-09-07 20:39:24
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推送给接收方
最新文章
- 进新公司用cornerstone-checkout后遇到的奇葩bug,及解决方法
- Memcache服务器端参数说明
- 【Java每日一题】20161013
- html4基础知识梳理
- eclipse https git
- ASP.NET Web API 路由
- ArcGis 获取地理、平面坐标系
- PySe-004-Se-WebDriver 启动浏览器之二 - Chrome
- 黄聪:wordpress如何获取当前分类页面的ID、名称、别名(slug)
- 修改win8系统中启动管理器的系统引导信息
- 三星 note3销售地查询、销售地代码
- 常用的bat命令
- Eclipse设置合适的字体
- avalon加载一闪而过现象
- 水晶报表中";已达到系统管理员配置的最大报表处理作业数限制";错误的处理
- 深入Eureka/Feign/Hystrix原理学习(1)
- redis5.0新特性
- c/c++ 标准库 vector
- json_encode转义中文问题
- PKCS#1