Channels集成到Django消息实时推送

摘要:
通道架构图InterFaceServer:负责解析协议并将不同的协议分发到不同的ChannelChannelLayer:通道层,可以是FIFO队列。通常,Channel:Channel在RedisDjang_LAYERS配置中配置:Channel_LAYERS={“default”:{“BACKEND”:“channels_redis.core.RedisChannelLa

channel架构图

Channels集成到Django消息实时推送第1张

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消息实时推送》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇logstash中关于Jdbc输入配置选项详解C# tostring()汇总下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django——orm概述及在django中使用

一、orm概述1 orm:对象关系映射(跟语言无关) 数据库中的表 ----》对应程序的一个类 数据库中的一行数据----》对应程序中的一个对象 2 python中常见orm框架 -django的orm框架 -sqlachemy orm框架 3 java:(扩展),java中写web项目...

Django中的Model模型

Model模型 模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。 通常,每个模型对应数据库中唯一的一张表。 每个模型都是django.db.models.Model的一个Python 子类。 模型的每个属性都表示为数据库中的一个字段。 Django 提供一套自动生成的用于数据库访问的API; 这极大的减轻了开发人员的工作量,不...

DateTimeField *** received a naive datetime (***) while time zone support is active

django报错: /usr/local/lib/python2.7/dist-packages/Django-1.8.2-py2.7.egg/django/db/models/fields/init.py:1474: RuntimeWarning: DateTimeField Org.updatedAt received a naive datetime...

Django文档——Model中的ForeignKey,ManyToManyField与OneToOneField

关联关系字段 (Relationship fields) ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系。 例如,一本书由一家出版社出版,一家出版社可以出版很多书。一本书由多个作者合写,一个作者可以写很多书。 class Author(models.Model):...

Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称。 外话:django中引入现成数据库 Django引入外部数据库还是比较方便的,步骤如下 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,...

django安装xadmin中出现的报错汇总

报错一:ModuleNotFoundError: No module named 'django.core.urlresolvers' 1 ModuleNotFoundError: No module named 'django.core.urlresolvers' 解决方法:按照提示找到出错的文件, 将所有 import django.core.urlr...