成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Django中如何使用Channels功能

瀏覽:106日期:2024-11-25 11:27:40
目錄一、什么是WebSocket二、什么是Channels三、Django中使用Channel四、前端Websocket使用五、測試Channels功能

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

一、什么是WebSocket

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

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

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

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

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

二、什么是Channels

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

2.1channels文件和配置的含義

asgi.py:介于網絡協議服務和Python應用之間的接口,能夠處理多種通用協議類型,包括HTTP、HTTP2和WebSocketchannel_layers:在settings.py中配置。類似于一個通道,發送者(producer)在一段發送消息,消費者(consumer)在另一端進行監聽routings.py:相當于Django中的urls.pyconsumers.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服務器和Web應用程序或者框架之間的一種簡單而通用的接口。

ASGI(Asynchronous Web Server Gateway Interface):異步網關協議接口,一個介于網絡協議服務和Python應用之間的標準接口,能夠處理多種通用的協議類型,包括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的同級目錄下創建routing.py路由文件,routing.py類似于Django中的url.py指明websocket協議的路由

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

ProtocolTypeRouter:ASGI支持多種不同的協議,在這里可以指定特定協議的路由信息,這里只使用了websocket協議,這里只配置websocket即可AllowedHostsOriginValidator:指定允許訪問的IP,設置后會去Django中的settings.py中去查找ALLOWED_HOSTS設置的IPAuthMiddlewareStack:用于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: 指定路由文件的路徑,也可以直接將路由信息寫在這里,代碼中配置了路由文件的路徑,會去對應應用下的routeing.py文件中查找websocket_urlpatterns

3.4webapp.routing.py內容如下

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

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

3.5在要使用WebSocket的應用中創建consumers.py,consumers.py是用來開發ASGI接口規范的python應用,而Django中的view.py是用來開發符合WSGI接口規范的python應用。

from channels.generic.websocket import WebsocketConsumerfrom channels.generic.websocket import AsyncWebsocketConsumerimport json,time

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

同步方式代碼如下:

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

異步方式代碼如下:

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

需要注意的是在異步中所有的邏輯都應該是異步的,不可以那同步的和異步的代碼混合使用。

四、前端Websocket使用

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

onopen: 當瀏覽器和websocket服務端連接成功后會觸發onopen消息onerror: 如果連接失敗,或者發送、接收數據失敗,或者數據處理出錯都會觸發onerror消息onmessage: 當瀏覽器接收到websocket服務器發送過來的數據時,就會觸發onmessage消息,參數e包含了服務端發送過來的數據onclose: 當瀏覽器接收到websocket服務器發送過來的關閉連接請求時,會觸發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’)};

關閉事件

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

接收事件

chatSocket.onmessage = function (e) { var data = JSON.parse(e.data);}五、測試Channels功能

Django中如何使用Channels功能

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

到此這篇關于Django中使用Channels功能的文章就介紹到這了,更多相關Django使用Channels內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
26uuu色噜噜精品一区二区| 一本一本久久a久久精品综合麻豆| 午夜私人影院久久久久| 成人国产在线观看| 国产欧美日韩综合精品二区| 91一区在线观看| 亚洲欧洲精品一区二区| 成人av资源在线| 一本久久精品一区二区| 国产精品多人| 香港久久久电影| **性色生活片久久毛片| 9久草视频在线视频精品| 欧美一级高清片| 全国精品久久少妇| 久久黄色小说| 日韩精品国产欧美| 亚洲男女自偷自拍| 亚洲综合在线第一页| 亚洲经典视频在线观看| 日韩av不卡在线观看| 久久亚洲综合色一区二区三区| 欧美一区二区三区在线视频| 精品免费99久久| 中文字幕在线观看一区二区| 欧美区高清在线| 久久综合国产精品| 99国产精品久久久久久久久久| 精品入口麻豆88视频| 国内精品久久久久影院一蜜桃| 欧美在线观看视频在线| 毛片不卡一区二区| 欧美日韩一区二区电影| 蜜臀av在线播放一区二区三区| 色视频成人在线观看免| 久久婷婷国产综合尤物精品| 欧洲一区二区三区免费视频| 国产精品污网站| 久久婷婷激情| 久久久久久一区| 久久久蜜桃一区二区人| 色偷偷久久一区二区三区| 欧美影片第一页| 欧美日韩精品系列| 成人午夜视频在线观看| 成人av片在线观看| 51精品国自产在线| av在线这里只有精品| 欧美高清一级片在线观看| 国产三级三级三级精品8ⅰ区| 日本不卡免费在线视频| 日韩精品亚洲一区二区三区免费| 国产日韩精品久久| 狠狠色综合色综合网络| 亚洲深夜av| 日韩精品三区四区| 欧美日韩国产美| 欧美黄在线观看| 亚洲卡通动漫在线| 国产久一道中文一区| 国内精品视频一区二区三区八戒| 精品国产91久久久久久久妲己 | 国产精品久久久久久妇女6080| aa级大片欧美| 欧美精品一区二区三区久久久| 亚洲欧美久久久| 久久精品国产99久久6| 91免费国产视频网站| 亚洲乱码精品一二三四区日韩在线| 免费亚洲一区二区| 蜜桃传媒麻豆第一区在线观看| 欧美大白屁股肥臀xxxxxx| 欧美天天在线| 国内久久婷婷综合| 日韩美女视频一区二区| 51午夜精品国产| 亚洲精品乱码久久久久久蜜桃91| 91亚洲国产成人精品一区二三| 欧美日韩1区| 午夜精品久久久久久久蜜桃app| 日韩视频123| 美女精品国产| 91蜜桃在线免费视频| 婷婷六月综合亚洲| 中国色在线观看另类| 久久精品日产第一区二区| gogo大胆日本视频一区| 视频一区二区三区入口| 国产精品色呦呦| 欧美一区二区三区免费观看视频 | 亚洲成年人网站在线观看| 久久女同互慰一区二区三区| 色婷婷av久久久久久久| 国产综合欧美| 国产精品系列在线观看| 亚洲成av人片一区二区梦乃| 国产欧美日韩三区| 欧美人伦禁忌dvd放荡欲情| 国产精品乱子乱xxxx| 91麻豆国产福利精品| 久久se这里有精品| 亚洲成人免费视频| 国产精品国模大尺度视频| 日韩女优制服丝袜电影| 欧美三级日韩三级| 午夜在线一区| 狠狠色综合网站久久久久久久| 国产99一区视频免费| 免费观看91视频大全| 亚洲一线二线三线久久久| 国产欧美精品一区aⅴ影院| 日韩欧美一区二区视频| 欧美在线视频全部完| 国产精品免费一区二区三区观看| 欧美精品一线| caoporn国产一区二区| 国产一区二区网址| 日av在线不卡| 日韩中文字幕亚洲一区二区va在线| 最新国产精品久久精品| 国产欧美一区二区精品仙草咪| 精品成人一区二区三区四区| 欧美日韩国产综合一区二区| 色94色欧美sute亚洲线路一ni| 国产视频在线观看一区| 欧美午夜视频| 欧美三级不卡| 91社区在线播放| 99这里只有久久精品视频| 国产精品自产自拍| 国产综合色精品一区二区三区| 麻豆免费看一区二区三区| 亚洲成av人片一区二区梦乃| 一区二区三区欧美激情| 亚洲欧美一区二区久久| 中文字幕在线免费不卡| 中文字幕一区二区三中文字幕| 久久精品水蜜桃av综合天堂| 久久蜜桃av一区精品变态类天堂| 91亚洲精品久久久蜜桃网站| 成人免费视频一区| jvid福利写真一区二区三区| 99视频精品在线| 91在线你懂得| 欧美日韩妖精视频| 99久久久久免费精品国产 | 91久久精品一区二区三| 免费精品视频在线| 91精品国产入口在线| 欧美久久在线| 亚洲大片在线观看| 韩国成人精品a∨在线观看| 91.麻豆视频| 成人高清视频在线| 中文字幕精品一区二区三区精品| 欧美日韩第一区| 亚洲一区二区视频在线观看| 亚洲一区二区网站| 国产成人精品影院| 中文字幕在线不卡| 国产一区二区高清| 久久久精品日韩欧美| 日韩精品欧美精品| 色综合视频一区二区三区高清| 亚洲一区二区三区在线播放| 7777精品伊人久久久大香线蕉超级流畅 | 欧美日韩系列| 亚洲精品亚洲人成人网| 成人综合激情网| 亚洲视频一区在线观看| 欧美日韩高清一区| 亚洲欧洲日本国产| 成人免费视频一区| 性久久久久久久久久久久| 精品美女一区二区| 日韩av不卡在线观看| 日韩一区二区在线免费观看| 国产成人av电影免费在线观看| 亚洲丰满少妇videoshd| 亚洲区一区二| 国产成人啪午夜精品网站男同| 一区二区三区高清| 337p亚洲精品色噜噜狠狠| 99在线|亚洲一区二区| 成人黄色av电影| 7777精品伊人久久久大香线蕉的 | 中文一区二区在线观看| 亚洲妇熟xx妇色黄| 国产成人精品一区二区三区网站观看| 国产精品久久7| 欧美中文字幕| 久久久久综合网| 亚洲gay无套男同| 99国内精品久久| 91精品福利视频| 国产精品毛片久久久久久| 老司机精品视频导航| 亚洲国产日韩欧美| 欧美一区二区三区在线观看| 一区二区视频在线|