中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么在django中使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊-創(chuàng)新互聯(lián)

本篇文章為大家展示了怎么在django中使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

在曹縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,曹縣網(wǎng)站建設(shè)費(fèi)用合理。

channels介紹

channels是以django插件的形式存在,它不僅能處理http請(qǐng)求,還提供對(duì)websocket、MQTT等長(zhǎng)連接支持。不僅如此,channels在保留了原生django的同步和易用的特性上還帶來(lái)了異步處理方式(channels2.X版本),并且將django自帶的認(rèn)證系統(tǒng)以及session集成到模塊中,擴(kuò)展性非常強(qiáng)。官方文檔:https://channels.readthedocs.io/en/latest/index.html

三、安裝以及安裝需求

channels2.0最低django版本要求是1.11+,python3.5+。筆者的版本是django1.11,直接安裝可能有問(wèn)題,以下是測(cè)試通過(guò)的版本。

筆者的相關(guān)版本如下:

Django==1.11.10
channels==2.1.4
channels-redis==2.3.1
asgiref==2.1.6
asgi-redis==1.4.3

如果django版本比較高直接采用pip安裝:

pip3 install channels
pip3 install channels-redis #可選的,官方推薦如果使用redis作為channel layer

redis安裝可以參考博客:https://www.jb51.net/article/151522.htm

四、開始使用

一、配置settings.py

筆者采用的redis作為channel layer(關(guān)于其介紹請(qǐng)移步至https://channels.readthedocs.io/en/latest/topics/channel_layers.html),它是實(shí)現(xiàn)消息推送的核心,在項(xiàng)目的settings.py中:

注冊(cè)channles app:

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'cmdb',
 'channels', #注冊(cè)app
]

配置channels layer:

ASGI_APPLICATION = 'devops.routing.application'
CHANNEL_LAYERS = {
 'default': {
  'BACKEND': 'channels_redis.core.RedisChannelLayer',
  'CONFIG': {
   "hosts": [('10.1.210.33', 6379)], #需修改
  },
 },
}

二、路由配置

在項(xiàng)目settings文件同級(jí)目錄中新增routing.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:wd

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import deploy.routing

application = ProtocolTypeRouter({
 'websocket': AuthMiddlewareStack(
  URLRouter(
   deploy.routing.websocket_urlpatterns# 指明路由文件是devops/routing.py
  )
 ),
})

最后在app里配置路由和對(duì)應(yīng)的消費(fèi)者,筆者這里是devops下的routing.py:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:wd
from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
 url(r'^ws/deploy/(?P<service_name>[^/]+)/$', consumers.DeployResult), #consumers.DeployResult 是該路由的消費(fèi)者
]

項(xiàng)目目錄結(jié)構(gòu)如下:

怎么在django中使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊

三、編寫webscoket消息處理方法(消費(fèi)者)

首先說(shuō)明,消費(fèi)者是Channels代碼的基本單元,當(dāng)一個(gè)新的Socket進(jìn)入的時(shí)候,Channels會(huì)根據(jù)路由表找到正確的消費(fèi)者,以下代碼中每個(gè)方法都可以看作一個(gè)消費(fèi)者,他們消費(fèi)不同的event,比如剛剛接受連接時(shí)候connect方法進(jìn)行消費(fèi)處理并接受連接,關(guān)閉websocket時(shí)候使用disconnect進(jìn)行消費(fèi)處理。

deploy/consumers.py:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:wd

from channels.generic.websocket import AsyncWebsocketConsumer
import json

class DeployResult(AsyncWebsocketConsumer):
 async def connect(self):
  self.service_uid = self.scope["url_route"]["kwargs"]["service_uid"]
  self.chat_group_name = 'chat_%s' % self.service_uid
  # 收到連接時(shí)候處理,
  await self.channel_layer.group_add(
   self.chat_group_name,
   self.channel_name
  )

  await self.accept()

 async def disconnect(self, close_code):
  # 關(guān)閉channel時(shí)候處理
  await self.channel_layer.group_discard(
   self.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("收到消息--》",message)
  # 發(fā)送消息到組
  await self.channel_layer.group_send(
   self.chat_group_name,
   {
    'type': 'client.message',
    'message': message
   }
  )

 # 處理客戶端發(fā)來(lái)的消息
 async def client_message(self, event):
  message = event['message']
  print("發(fā)送消息。。。",message)
  # 發(fā)送消息到 WebSocket
  await self.send(text_data=json.dumps({
   'message': message
  }))

以上代碼部分說(shuō)明:

1.self.scope是單個(gè)連接傳入的詳細(xì)信息,其中包含了請(qǐng)求的session、以及django認(rèn)證系統(tǒng)中的用戶信息等;

2.async...await 是python3.5之后的新異步特性,基于asyncio模塊;

四、發(fā)起webscoket請(qǐng)求

利用js發(fā)起websocket請(qǐng)求

function InitWebSocket() {
   var websocket = new WebSocket( 
    'ws://' + window.location.host + '/ws/deploy/tasks/' );

   websocket.onmessage = function (e) {
    var data = JSON.parse(e.data);
    var message = '\n' + data['message'];
    document.querySelector('#deploy-res').innerText += (message + '\n');
   };
  }

五、發(fā)送消息到channel
無(wú)論是消息的推送或者消息的接受,都是經(jīng)過(guò)channel layer進(jìn)行傳輸,以下是發(fā)送消息示例,

from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync


channel_layer = get_channel_layer()
def send_channel_msg(channel_name, msg):
  """
  send msg to channel
  :param channel_name: 
  :param msg: 
  :return: 
  """
 async_to_sync(channel_layer.group_send)(channel_name,
             {"type": "deploy.run", "text": msg})

上述內(nèi)容就是怎么在django中使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:怎么在django中使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊-創(chuàng)新互聯(lián)
文章鏈接:http://www.rwnh.cn/article28/jdgcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)ChatGPT、Google響應(yīng)式網(wǎng)站、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
舟曲县| 广东省| 鲜城| 呈贡县| 新建县| 成武县| 佳木斯市| 普格县| 芦溪县| 巫溪县| 依兰县| 祁阳县| 即墨市| 平谷区| 湟中县| 吉林市| 抚州市| 海门市| 嘉善县| 泾川县| 丰县| 黎城县| 万载县| 九江市| 五原县| 玉林市| 腾冲县| 岚皋县| 喀喇| 泰来县| 西乌珠穆沁旗| 韶关市| 右玉县| 石首市| 莎车县| 南康市| 衢州市| 唐海县| 玉环县| 辛集市| 汽车|