宝哥软件园

django使用channels2.x实现实时通信

编辑:宝哥软件园 来源:互联网 时间:2021-08-28

一.背景

最近项目中的需求之一是实时消息推送和通知功能。该项目由django编写,因此决定使用django-channel实现websocket进行实时通信。目前官方版本已经更新到了2.1版本,与旧版channels 1.x相比变化很大,最大的变化是2.x版本带来的asyncio特性,可以使用异步处理模式。本文将介绍channels2版本的使用。因为django项目是1.11,所以也会遇到一些坑。例如,通道处理请求后,挂起停止,然后报告错误。后来针对这个问题修改了django1.11版本的源代码,2.0版本应该没问题。

二、引入渠道

Channels作为django插件存在,不仅可以处理http请求,还可以为websocket、MQTT等长连接提供支持。而且,通道不仅保持了原生django的同步和易用特性,还带来了异步处理模式(channels2。x版本),并将django自己的认证系统和会话集成到模块中,具有很强的可扩展性。正式文件:https://channels.readthedocs.io/en/latest/index.html

三.安装和安装要求

channels2.0的最低django版本要求是1.11和python3.5,作者的版本是django1.11,直接安装可能会有问题。以下是通过测试的版本。

作者的相关版本如下:

Django==1 . 11 . 10 channels==2 . 1 . 4 channels-redis==2 . 3 . 1 asgiref==2 . 1 . 6 asgi-redis==1 . 4 . 3如果django版本相对较高,则由pip直接安装:

Pip 3安装通道Spip 3安装通道-redis #可选,官方推荐如果你使用redis作为通道层安装,你可以参考博客:https://www.jb51.net/article/151522.htm

第四,开始使用

1.配置设置。py

作者使用redis作为通道层(其介绍请到https://channels.readthedocs.io/en/latest/topics/channel _ layers . html),这是消息推送的核心。在项目的settings.py中:

注册channles应用程序:

INSTANDED _ APPS=[' django . contrib . admin ',' django.contrib.auth ',' django . content types ',' django.contrib.sessions ',' django.contrib.messages ',' Django.contrib.static files ',' CMDB ',' channels ',# registered app]配置通道层:

ASGI _ APPLICATION=' devo PS . routing . APPLICATION ' channel _ LAYERS={ ' default ' : { '后端' : ' channels _ redis . core . redischannellayer ',Config ' : { ' hosts ' :[(10 . 1 . 210 . 33 ',6379)],#需要修改},},}第二,路由配置

在项目设置文件的同级目录中添加routing.py

#!/usr/bin/env python 3 #-*-coding : utf-8-*-# author : wdfrom channels . auth import authmiddlewarestackffrom channels . routing import protocol typerouter,urlsrouterimport deploy . routing application=protocol typerouter({ ' web socket ' : AuthMiddlewareStack(urrouter(deploy . routing . web socket _ URL patterns #表示路由文件是devops/routing.py)),})最后,配置路由和相应的使用者本文作者是devops下的routing.py:

#!/usr/bin/env python 3 #-*-coding : utf-8-*-# author : wdfrom django . conf . URL导入urlfrom。import consumers WebSocket _ URL patterns=[url(r'^ws/deploy/(?P service _ name [/])/$ ',消费者。deployresult),#消费者。deployresult是此路由的使用者]项目目录结构如下:

第三,编写webscoket消息处理方法(消费者)

首先,消费者是渠道代码的基本单位。当新的套接字进入时,通道将根据路由表找到正确的消费者。下面代码中的每个方法都可以看作一个消费者,它们消费不同的事件。例如,当只接受连接时,connect方法执行消耗处理并接受连接,当关闭websocket时,它使用disconnect执行消耗处理。

deploy/consumers.py:

#!/usr/bin/env python 3 #-*-编码: utf-8-*-#作者: wdfrom通道。通用。web套接字导入AsyncWebsocketConsumerimport JSON class DeployResult(AsyncWebsocketConsumer): async def connect(self): self。service _ uid=self。作用域[' URL _ route '][' kwargs '][' service _ uid ']self。聊天_群组_名称='聊天收到连接时候处理等待自我。通道层。group _ add(self。聊天组名,自我。channel _ name)等待自我。accept()async def disconnect(self,close_code): #关闭引导时候处理等待自我。通道层。group _ discard(自我。chat _ group _ name,self.channel_name ) #收到消息async def receive(self,text _ data): text _ data _ JSON=JSON。loads(text _ data)message=text _ data _ JSON[' message ']print('收到消息-》,消息)#发送消息到组等待自我。通道层。group _ send(自我。chat _ group _ name,{ '键入' : 'client.message ',' message': message } ) #处理客户端发来的消息async def client_message(self,event): message=event[' message ']print('发送消息消息)#发送消息到WebSocket等待自我。send(text _ data=JSON。转储({ ' message ' : message }))以上代码部分说明:

1 .自我。范围是单个连接传入的详细信息,其中包含了请求的会议,以及框架认证系统中的用户信息等;

2 .异步.等待是python3.5之后的新异步特性,基于异步超正析象管(Image Orthicon)模块;

四、发起webscoket请求

利用射流研究…发起求转发到请求

函数InitWebSocket(){ var web socket=new web socket(' ws ://'窗口。位置。host '/ws/deploy/tasks/');web套接字。on message=function(e){ var data=JSON。解析(例如数据);var message=' n ' data[' message '];文件。queryselector(' # deploy-RES ').innerText=(消息 n ');};}五、发送消息到引导无论是消息的推送或者消息的接受,都是经过通道层进行传输,以下是发送消息示例,

从频道。图层从asgiref导入get _ channel _ layer。同步导入async _ to _ sync通道_ layer=get _ channel _ layer()def send _ channel _ msg(通道名称,msg):“”发送消息到通道: param channel _ name : param msg : ' '返回: ' ' async _ to _ sync(channel _ layer。group _ send)(channel _ name,{ ' type ' : '六、生产部署

大多数框架的应用部署方式都采用的是nginx uwsgi进行部署,当框架集成通道时候,由于方法不能处理求转发到请求,所以我们需要亚洲科学增高研究所服务器来处理求转发到请求,官方推荐使用达芙妮。下一篇文章将介绍服务器主管daphne uwsgi进行生产部署。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+