<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題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關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

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

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:03:20
        文檔

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

        django使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊:一、背景 在最近的項(xiàng)目中的一個(gè)需求是消息實(shí)時(shí)推送消息以及通知功能,項(xiàng)目使用django寫(xiě)的所以決定采用django-channels來(lái)實(shí)現(xiàn)websocket進(jìn)行實(shí)時(shí)通訊。目前官方已經(jīng)更新到2.1版本,相對(duì)于老的channels 1.x版本有了很大變化,無(wú)論是使用方式還是功能,其中最大
        推薦度:
        導(dǎo)讀django使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊:一、背景 在最近的項(xiàng)目中的一個(gè)需求是消息實(shí)時(shí)推送消息以及通知功能,項(xiàng)目使用django寫(xiě)的所以決定采用django-channels來(lái)實(shí)現(xiàn)websocket進(jìn)行實(shí)時(shí)通訊。目前官方已經(jīng)更新到2.1版本,相對(duì)于老的channels 1.x版本有了很大變化,無(wú)論是使用方式還是功能,其中最大

        一、背景

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

        二、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.gxlcms.com/article/151522.htm

        四、開(kāi)始使用

        一、配置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)如下:

        三、編寫(xiě)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
         }
         )
        
         # 處理客戶(hù)端發(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)中的用戶(hù)信息等;

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

        六、生產(chǎn)部署

        大多數(shù)django的應(yīng)用部署方式都采用的是nginx+uwsgi進(jìn)行部署,當(dāng)django集成channels時(shí)候,由于uwsgi不能處理websocket請(qǐng)求,所以我們需要asgi服務(wù)器來(lái)處理websocket請(qǐng)求,官方推薦使用daphne。下一篇文章將介紹nginx+supervisor+daphne+uwsgi進(jìn)行生產(chǎn)部署。

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        django使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊:一、背景 在最近的項(xiàng)目中的一個(gè)需求是消息實(shí)時(shí)推送消息以及通知功能,項(xiàng)目使用django寫(xiě)的所以決定采用django-channels來(lái)實(shí)現(xiàn)websocket進(jìn)行實(shí)時(shí)通訊。目前官方已經(jīng)更新到2.1版本,相對(duì)于老的channels 1.x版本有了很大變化,無(wú)論是使用方式還是功能,其中最大
        推薦度:
        標(biāo)簽: Django 2.x djang
        • 熱門(mén)焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門(mén)推薦

        專(zhuān)題
        Top
        主站蜘蛛池模板: 亚洲第一精品在线视频| 四虎影视精品永久免费网站| 综合久久久久久中文字幕亚洲国产国产综合一区首| 亚洲婷婷天堂在线综合| 麻豆成人久久精品二区三区免费| 久久香蕉国产线看观看亚洲片| 三级黄色免费观看| 国产V亚洲V天堂无码| 在线看片免费人成视频福利| 亚洲国产精品无码中文字| 久久久久国产精品免费看| 亚洲精品福利视频| 日本阿v免费费视频完整版| 亚洲欧美成aⅴ人在线观看| 国产极品美女高潮抽搐免费网站| 成人精品国产亚洲欧洲| 久久精品国产精品亚洲人人| a级片免费在线播放| 久久99亚洲网美利坚合众国| 18禁网站免费无遮挡无码中文 | 亚洲人成电影网站久久| 女人被弄到高潮的免费视频| 美国毛片亚洲社区在线观看 | 国产免费卡一卡三卡乱码| 春意影院午夜爽爽爽免费| 不卡一卡二卡三亚洲| 免费一级毛片无毒不卡| 亚洲国产视频网站| 日韩一区二区在线免费观看 | 四虎国产成人永久精品免费| 亚洲最大黄色网址| 国产男女猛烈无遮挡免费网站| 久久一区二区免费播放| 亚洲色图.com| 免费国产怡红院在线观看| 免费黄色电影在线观看| 亚洲精品无码av片| 亚洲国产精品久久| 国产嫩草影院精品免费网址| 99热在线观看免费| 老司机免费午夜精品视频|