国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

django使用channels2.x實現實時通訊

來源:懂視網 責編:小采 時間:2020-11-27 22:03:20
文檔

django使用channels2.x實現實時通訊

django使用channels2.x實現實時通訊:一、背景 在最近的項目中的一個需求是消息實時推送消息以及通知功能,項目使用django寫的所以決定采用django-channels來實現websocket進行實時通訊。目前官方已經更新到2.1版本,相對于老的channels 1.x版本有了很大變化,無論是使用方式還是功能,其中最大
推薦度:
導讀django使用channels2.x實現實時通訊:一、背景 在最近的項目中的一個需求是消息實時推送消息以及通知功能,項目使用django寫的所以決定采用django-channels來實現websocket進行實時通訊。目前官方已經更新到2.1版本,相對于老的channels 1.x版本有了很大變化,無論是使用方式還是功能,其中最大

一、背景

在最近的項目中的一個需求是消息實時推送消息以及通知功能,項目使用django寫的所以決定采用django-channels來實現websocket進行實時通訊。目前官方已經更新到2.1版本,相對于老的channels 1.x版本有了很大變化,無論是使用方式還是功能,其中最大的變化莫過于2.x版本中帶來的asyncio特性,可使用異步處理模式。本文內容將介紹channels2版本使用,由于項目django是1.11,其中也遇到了一些坑,比如在channels在處理一次請求后hang住然后報錯,后面修改了下django1.11版本的一點源碼得以解決,2.0版本應該不會有問題。

二、channels介紹

channels是以django插件的形式存在,它不僅能處理http請求,還提供對websocket、MQTT等長連接支持。不僅如此,channels在保留了原生django的同步和易用的特性上還帶來了異步處理方式(channels2.X版本),并且將django自帶的認證系統以及session集成到模塊中,擴展性非常強。官方文檔: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安裝:

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

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

四、開始使用

一、配置settings.py

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

注冊channles app:

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

配置channels layer:

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

二、路由配置

在項目settings文件同級目錄中新增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里配置路由和對應的消費者,筆者這里是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 是該路由的消費者
]

項目目錄結構如下:

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

首先說明,消費者是Channels代碼的基本單元,當一個新的Socket進入的時候,Channels會根據路由表找到正確的消費者,以下代碼中每個方法都可以看作一個消費者,他們消費不同的event,比如剛剛接受連接時候connect方法進行消費處理并接受連接,關閉websocket時候使用disconnect進行消費處理。

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
 # 收到連接時候處理,
 await self.channel_layer.group_add(
 self.chat_group_name,
 self.channel_name
 )

 await self.accept()

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

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

以上代碼部分說明:

1.self.scope是單個連接傳入的詳細信息,其中包含了請求的session、以及django認證系統中的用戶信息等;

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

四、發起webscoket請求

利用js發起websocket請求

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');
 };
 }

五、發送消息到channel
無論是消息的推送或者消息的接受,都是經過channel layer進行傳輸,以下是發送消息示例,

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})

六、生產部署

大多數django的應用部署方式都采用的是nginx+uwsgi進行部署,當django集成channels時候,由于uwsgi不能處理websocket請求,所以我們需要asgi服務器來處理websocket請求,官方推薦使用daphne。下一篇文章將介紹nginx+supervisor+daphne+uwsgi進行生產部署。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

django使用channels2.x實現實時通訊

django使用channels2.x實現實時通訊:一、背景 在最近的項目中的一個需求是消息實時推送消息以及通知功能,項目使用django寫的所以決定采用django-channels來實現websocket進行實時通訊。目前官方已經更新到2.1版本,相對于老的channels 1.x版本有了很大變化,無論是使用方式還是功能,其中最大
推薦度:
標簽: Django 2.x djang
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 欧美色图日韩 | 国产免费一级片 | 欧美三级在线 | 日韩欧美大陆 | 一级毛片免费的 | 青草视频在线观看免费 | 日本一区二区视频在线观看 | 日韩欧美精品综合一区二区三区 | 国产午夜电影在线观看 | 日韩欧美高清 | 久久精品无码一区二区日韩av | 国产 日韩 欧美 综合 | 日本高清一区二区三区不卡免费 | 最刺激黄a大片免费观看 | 国产在线播放一区 | 手机看片91精品一区 | 精品伊人| 久久久久久久一精品 | 国产亚洲人成a在线v网站 | 干比网| 在线视频一二三区 | 国内自拍一区 | 看全黄大色大黄美女 | 日韩 亚洲 欧美 中文 高清 | 欧美高清69hd | 欧美日韩国产另类一区二区三区 | 欧美日韩高清一区二区三区 | 国产一级特黄aaaa大片野外 | 国产啪在线91 | 国产精品亚洲精品观看不卡 | 亚洲视频在线观看网站 | 久久国产一区二区 | 国产一区亚洲欧美成人 | 国产免费全部免费观看 | 国产精品视频免费看 | 精品国产乱码久久久久久一区二区 | 欧美精品一二三 | 日韩在线视频免费观看 | 国产精品成人h片在线 | 欧美性另类69xxx| 国产精品高清在线观看 |