最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django中如何使用Channels功能

 更新時間:2021年08月18日 08:35:53   作者:在質(zhì)疑中選擇向前  
這篇文章主要介紹了在Django中使用Channels功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言:最近后臺寫游戲更新版本功能,簡單就是前端發(fā)送更新請求,后端需要對很多臺服務(wù)器進行更新和各種操作,本來想著實現(xiàn)不難,后來發(fā)現(xiàn)因為后端需要執(zhí)行很長時間,前端返回報錯,后端會執(zhí)行完畢,但是前端先斷開了,這樣在前端頁面我就看不到更新結(jié)果了。通過調(diào)整nginx參數(shù),設(shè)置超時時間,還是日志會報499狀態(tài)碼錯誤。后來了解到了websocket,對于需要長時間處理的請求,使用websocket會更好,通過使用websocket實現(xiàn)了自己的功能,簡單分享下

一、什么是WebSocket

WebSocket是一種在單個TCP連接上進行全雙工通訊的協(xié)議。WebSocket允許服務(wù)端主動向客戶端推送數(shù)據(jù)。
在WebSocket協(xié)議中,客戶端瀏覽器和服務(wù)器只需要完成一次握手就可以創(chuàng)建持久性的連接,并在瀏覽器和服務(wù)器之間進行雙向的數(shù)據(jù)傳輸。

WebSocket的響應(yīng)頭中重要的字段:
HTTP/1.1 101 Swi tching Protocols:切換協(xié)議,WebSocket協(xié)議通過HTTP協(xié)議來建立運輸層的TCP連接
Connection和Upgrade:表示服務(wù)端發(fā)起的WebSocket響應(yīng)
Sec-WebSocket-Accept:表示服務(wù)器接受了客戶端的請求,由Sec-WebSocket-Key計算得來

WebSocket協(xié)議的優(yōu)點:
支持雙向通信,實時性更強
數(shù)據(jù)格式比較輕量,性能開銷小,通信高效
支持擴展,用戶可以擴展協(xié)議或者實現(xiàn)自定義的子協(xié)議(比如支持自定義壓縮算法等)

WebSocket協(xié)議的缺點:
少部分瀏覽器不支持,瀏覽器支持的程度與方式有區(qū)別
長連接對后端處理業(yè)務(wù)的代碼穩(wěn)定性要求更高,后端推送功能相對復(fù)雜
成熟的HTTP生態(tài)下有大量的組件可以復(fù)用,WebSocket較少

WebSocket的應(yīng)用場景:
即時聊天通信,網(wǎng)站消息通知
在線協(xié)同編輯,如騰訊文檔
多玩家在線游戲,視頻彈幕,股票基金實施報價

二、什么是Channels

Django本身不支持WebSocket,但可以通過集成Channels框架來實現(xiàn)WebSocket
Channels是針對Django項目的一個增強框架,可以使Django不僅支持HTTP協(xié)議,還能支持WebSocket,MQTT等多種協(xié)議,同時Channels還整合了Django的auth以及session系統(tǒng)方便進行用戶管理及認證。

2.1channels文件和配置的含義

asgi.py:介于網(wǎng)絡(luò)協(xié)議服務(wù)和Python應(yīng)用之間的接口,能夠處理多種通用協(xié)議類型,包括HTTP、HTTP2和WebSocket
channel_layers:在settings.py中配置。類似于一個通道,發(fā)送者(producer)在一段發(fā)送消息,消費者(consumer)在另一端進行監(jiān)聽
routings.py:相當于Django中的urls.py
consumers.py:相當于Django中的views.py

2.2channels文檔鏈接

https://channels.readthedocs.io/en/latest/introduction.html

2.3.WSGI和ASGI不同

WSGI(Python Web Server Gateway Interface):為Python語言定義的Web服務(wù)器和Web應(yīng)用程序或者框架之間的一種簡單而通用的接口。

ASGI(Asynchronous Web Server Gateway Interface):異步網(wǎng)關(guān)協(xié)議接口,一個介于網(wǎng)絡(luò)協(xié)議服務(wù)和Python應(yīng)用之間的標準接口,能夠處理多種通用的協(xié)議類型,包括HTTP,HTTP2和WebSocket。

三、Django中使用Channel

3.1安裝channels

pip install channels==2.1.7

3.2修改setting.py文件

INSTALLED_APPS = [
    'django.contrib.staticfiles',
    ... ...
    'channels',
]
 
# 指定ASGI的路由地址
ASGI_APPLICATION = 'webapp.routing.application' #ASGI_APPLICATION 指定主路由的位置為webapp下的routing.py文件中的application

3.3setting.py的同級目錄下創(chuàng)建routing.py路由文件,routing.py類似于Django中的url.py指明websocket協(xié)議的路由

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
import webapp.routing
 
application = ProtocolTypeRouter({
    'websocket':AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                webapp.routing.websocket_urlpatterns
            )
        )
    )
})

ProtocolTypeRouter:ASGI支持多種不同的協(xié)議,在這里可以指定特定協(xié)議的路由信息,這里只使用了websocket協(xié)議,這里只配置websocket即可
AllowedHostsOriginValidator:指定允許訪問的IP,設(shè)置后會去Django中的settings.py中去查找ALLOWED_HOSTS設(shè)置的IP
AuthMiddlewareStack:用于WebSocket認證,繼承了Cookie Middleware,SessionMiddleware,SessionMiddleware。
django的channels封裝了django的auth模塊,使用這個配置我們就可以在consumer中通過下邊的代碼獲取到用戶的信息,和請求的url路徑

self.sc

def connect(self):
    self.user = self.scope["user"]
    self.request_url = self.scope['path']

ope類似于django中的request,包含了請求的type、path、header、cookie、session、user等等有用的信息
URLRouter: 指定路由文件的路徑,也可以直接將路由信息寫在這里,代碼中配置了路由文件的路徑,會去對應(yīng)應(yīng)用下的routeing.py文件中查找websocket_urlpatterns

3.4webapp.routing.py內(nèi)容如下

from django.urls import path
from webapp.consumers import ChatConsumer
 
websocket_urlpatterns = [
  path('ws/chat/',ChatConsumer)
]

routing.py路由文件跟django的url.py功能類似,語法也一樣,意思就是訪問ws/chat/都交給ChatConsumer處理?! ?/p>

3.5在要使用WebSocket的應(yīng)用中創(chuàng)建consumers.py,consumers.py是用來開發(fā)ASGI接口規(guī)范的python應(yīng)用,而Django中的view.py是用來開發(fā)符合WSGI接口規(guī)范的python應(yīng)用?! ?/p>

from channels.generic.websocket import WebsocketConsumer
from channels.generic.websocket import AsyncWebsocketConsumer
import json,time

Channels支持同步,也支持異步方式

同步方式代碼如下:

class ChatConsumer(WebsocketConsumer):
    # websocket建立連接時執(zhí)行方法
    def connect(self):
        self.accept()
     
    # websocket斷開時執(zhí)行方法
    def disconnect(self, close_code):
        self.close()
     
    # 從websocket接收到消息時執(zhí)行函數(shù)
    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = f'結(jié)果:{text_data_json}'
        self.send(text_data=json.dumps(
        {
             'message': message
        }))

異步方式代碼如下:

class ChatConsumer(AsyncWebsocketConsumer):
    #websocket建立連接時執(zhí)行方法
    async def connect(self):
        await self.accept()
 
    # websocket斷開時執(zhí)行方法
    async def disconnect(self, close_code):
        print(close_code)
 
 
    # 從websocket接收到消息時執(zhí)行函數(shù)
    async def receive(self, text_data):
        for i in range(10):
            time.sleep(i)
            message = '結(jié)果: ' + str(i)
            await self.send(text_data=json.dumps({
                'message': message
            })
        )

需要注意的是在異步中所有的邏輯都應(yīng)該是異步的,不可以那同步的和異步的代碼混合使用?! ?/p>

四、前端Websocket使用

WebSocket對象一個支持四個消息:onopen,onmessage,oncluse和onerror

onopen: 當瀏覽器和websocket服務(wù)端連接成功后會觸發(fā)onopen消息
onerror: 如果連接失敗,或者發(fā)送、接收數(shù)據(jù)失敗,或者數(shù)據(jù)處理出錯都會觸發(fā)onerror消息
onmessage: 當瀏覽器接收到websocket服務(wù)器發(fā)送過來的數(shù)據(jù)時,就會觸發(fā)onmessage消息,參數(shù)e包含了服務(wù)端發(fā)送過來的數(shù)據(jù)
onclose: 當瀏覽器接收到websocket服務(wù)器發(fā)送過來的關(guān)閉連接請求時,會觸發(fā)onclose消息

拼接websocket請求地址,建立長連接

var chatSocket = new WebSocket('ws://' + window.location.host + '/ws/ver_update/');

連接事件  

chatSocket.onopen = function () {
    console.log(getCurrentDate(2) + ' ' + 'websocket connection success')
};

錯誤事件

chatSocket.onerror = function () {
    console.error(getCurrentDate(2) + ' ' + 'websocket connection error')
};

關(guān)閉事件

chatSocket.onclose = function (e) {
    layer.msg('websocket關(guān)閉,檢查錯誤日志', {icon: 2});
    console.error(getCurrentDate(2) + ' ' + 'websocket closed unexpectedly 狀態(tài)碼:' + e.code);
    chatSocket.close();
};

接收事件

chatSocket.onmessage = function (e) {
    var data = JSON.parse(e.data);
}

五、測試Channels功能      

總結(jié):自從使用Websocket功能后,再也沒發(fā)生前端突然斷開的情況了,對于長時間運行的任務(wù),使用websocket是不錯的選擇~,有不足的地方請多多指教  

到此這篇關(guān)于Django中使用Channels功能的文章就介紹到這了,更多相關(guān)Django使用Channels內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Swift中屬性的聲明與作用

    詳解Swift中屬性的聲明與作用

    Swift中的屬性可以被分為存儲屬性和計算屬性,本文將為大家詳解Swift中屬性的聲明與作用,需要的朋友可以參考下
    2016-06-06
  • opencv+playwright滑動驗證碼的實現(xiàn)

    opencv+playwright滑動驗證碼的實現(xiàn)

    滑動驗證碼是常見的驗證碼之一,本文主要介紹了opencv+playwright滑動驗證碼的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • python實現(xiàn)簡單的五子棋游戲

    python實現(xiàn)簡單的五子棋游戲

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單的五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • int在python中的含義以及用法

    int在python中的含義以及用法

    在本篇文章中小編給大家整理了關(guān)于int在python中的含義以及用法,對此有興趣的朋友們可以跟著學(xué)習(xí)下。
    2019-06-06
  • PyTorch中 tensor.detach() 和 tensor.data 的區(qū)別詳解

    PyTorch中 tensor.detach() 和 tensor.data 的區(qū)別詳解

    今天小編就為大家分享一篇PyTorch中 tensor.detach() 和 tensor.data 的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python使用tkinter實現(xiàn)透明窗體

    python使用tkinter實現(xiàn)透明窗體

    一直在思索實現(xiàn)一個透明的窗體,然后可以基于這個窗體可以開發(fā)出各種好玩的應(yīng)用(如桌面運動的小人、運動的小球、截圖、錄制GIF等等),今天無意間居然讓我把其中一個最核心的技術(shù)難關(guān)突破了,我非常高興,也借這個機會跟大家分享一下。
    2021-05-05
  • Pycharm創(chuàng)建項目時如何自動添加頭部信息

    Pycharm創(chuàng)建項目時如何自動添加頭部信息

    這篇文章主要介紹了Pycharm創(chuàng)建項目時 自動添加頭部信息,需要的朋友可以參考下
    2019-11-11
  • python中字典按鍵或鍵值排序的實現(xiàn)代碼

    python中字典按鍵或鍵值排序的實現(xiàn)代碼

    這篇文章主要介紹了python中字典按鍵或鍵值排序的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python報錯ValueError: cannot reindex from a duplicate axis的解決方法

    Python報錯ValueError: cannot reindex from 

    當處理Pandas數(shù)據(jù)框(DataFrame)時,你是否遇到過ValueError: cannot reindex from a duplicate axis的報錯?這個問題通常發(fā)生在嘗試對DataFrame進行重索引時,如果索引有重復(fù)值,就會觸發(fā)這個錯誤,下面,我們將探討這個問題并提供解決方法
    2024-09-09
  • 十分鐘輕松掌握dataframe數(shù)據(jù)選擇

    十分鐘輕松掌握dataframe數(shù)據(jù)選擇

    這篇文章主要介紹了十分鐘輕松掌握dataframe數(shù)據(jù)選擇,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

宁远县| 新巴尔虎右旗| 余干县| 睢宁县| 淮南市| 灵璧县| 个旧市| 防城港市| 成都市| 渝中区| 剑阁县| 莫力| 梨树县| 宝坻区| 博客| 赤峰市| 石景山区| 屏边| 黔西县| 上饶县| 邢台县| 芒康县| 宁南县| 临泉县| 潜山县| 铁力市| 会泽县| 邵阳县| 客服| 南充市| 镶黄旗| 三穗县| 汤原县| 南召县| 托克逊县| 上蔡县| 卫辉市| 巴彦县| 凤山县| 涟水县| 兴国县|