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推送给接收方

最新文章

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

热门文章

  1. LCA 学习总结
  2. django开发最完美手机购物商城APP带前后端源码
  3. 内容安全策略(CSP)详解
  4. C#winform跨窗体传值和调用事件的办法
  5. Shiro+Mybatis实现登录认证、授权功能
  6. javaWeb删除一条及多条数据
  7. strcmp比较字符串
  8. bootstrap基本页面
  9. masonry中的make,remake,update
  10. springmvc 校验---spring校验