Django websocket原理及功能實現(xiàn)代碼
一 什么是Websocket
WebSocket是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議
WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸
現(xiàn)在,很多網(wǎng)站為了實現(xiàn)推送技術(shù),所用的技術(shù)都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務(wù)器發(fā)出HTTP請求,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。這種傳統(tǒng)的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務(wù)器發(fā)出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數(shù)據(jù)可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
而比較新的技術(shù)去做輪詢的效果是Comet。這種技術(shù)雖然可以雙向通信,但依然需要反復(fù)發(fā)出請求。而且在Comet中,普遍采用的長鏈接,也會消耗服務(wù)器資源。
在這種情況下,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實時地進(jìn)行通訊
二 Django實現(xiàn)Websocket
django實現(xiàn)websocket大致上有兩種方式,一種channels,一種是dwebsocket。channels依賴于redis,twisted等,相比之下使用dwebsocket要更為方便一些
三 dwebsocket安裝
pip3 install dwebsocket
四 dwebsocket配置
INSTALLED_APPS = [ ..... ..... 'dwebsocket', ] MIDDLEWARE_CLASSES = [ ...... ...... 'dwebsocket.middleware.WebSocketMiddleware' # 為所有的URL提供websocket,如果只是單獨的視圖需要可以不選 ] WEBSOCKET_ACCEPT_ALL=True # 可以允許每一個單獨的視圖實用websockets
五 使用
html代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button onclick="WebSocketTest()">test</button> </body> <script> function WebSocketTest() { alert(1) if ("WebSocket" in window) { alert("您的瀏覽器支持 WebSocket!"); // 打開一個 web socket ws = new WebSocket("ws://127.0.0.1:8000/path/"); ws.onopen = function () { // Web Socket 已連接上,使用 send() 方法發(fā)送數(shù)據(jù) ws.send("發(fā)送數(shù)據(jù)"); alert("數(shù)據(jù)發(fā)送中..."); }; ws.onmessage = function (evt) { var received_msg = evt.data; alert("數(shù)據(jù)已接收..."); alert("數(shù)據(jù):" + received_msg) }; ws.onclose = function () { // 關(guān)閉 websocket alert("連接已關(guān)閉..."); }; } else { // 瀏覽器不支持 WebSocket alert("您的瀏覽器不支持 WebSocket!"); } } </script> </html>
views視圖層:
from django.shortcuts import render,HttpResponse # Create your views here. def login(request): return render(request,'login.html') from dwebsocket.decorators import accept_websocket @accept_websocket def path(request): if request.is_websocket(): print(1) request.websocket.send('下載完成'.encode('utf-8'))
路由層:
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^path/', views.path), ]
六 詳解
#dwebsocket有兩種裝飾器:require_websocket和accept_websocekt,使用require_websocket裝飾器會導(dǎo)致視圖函數(shù)無法接收導(dǎo)致正常的http請求,一般情況使用accept_websocket方式就可以了,
#
# dwebsocket的一些內(nèi)置方法:
#
# request.is_websocket():判斷請求是否是websocket方式,是返回true,否則返回false
# request.websocket: 當(dāng)請求為websocket的時候,會在request中增加一個websocket屬性,
# WebSocket.wait() 返回客戶端發(fā)送的一條消息,沒有收到消息則會導(dǎo)致阻塞
# WebSocket.read() 和wait一樣可以接受返回的消息,只是這種是非阻塞的,沒有消息返回None
# WebSocket.count_messages()返回消息的數(shù)量
# WebSocket.has_messages()返回是否有新的消息過來
# WebSocket.send(message)像客戶端發(fā)送消息,message為byte類型
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于python requests selenium爬取excel vba過程解析
這篇文章主要介紹了基于python requests selenium爬取excel vba過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08Django認(rèn)證系統(tǒng)實現(xiàn)的web頁面實現(xiàn)代碼
這篇文章主要介紹了Django認(rèn)證系統(tǒng)實現(xiàn)的web頁面實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08Python操作PostgreSQL數(shù)據(jù)庫的基本方法(增刪改查)
PostgreSQL數(shù)據(jù)庫是最常用的關(guān)系型數(shù)據(jù)庫之一,最吸引人的一點是它作為開源數(shù)據(jù)庫且具有可拓展性,能夠提供豐富的應(yīng)用,這篇文章主要給大家介紹了關(guān)于Python操作PostgreSQL數(shù)據(jù)庫的基本方法,文中介紹了連接PostgreSQL數(shù)據(jù)庫,以及增刪改查,需要的朋友可以參考下2023-09-09python ChainMap 合并字典的實現(xiàn)步驟
這篇文章主要介紹了python ChainMap 合并字典的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Python如何使用type()函數(shù)查看數(shù)據(jù)的類型
這篇文章主要介紹了Python如何使用type()函數(shù)查看數(shù)據(jù)的類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Pycharm設(shè)置自動代碼提示的超詳細(xì)圖文教程
有時候我們在使用pycharm編寫python代碼的時候,發(fā)現(xiàn)沒有代碼提示,怎么解決呢?下面這篇文章主要給大家介紹了關(guān)于Pycharm設(shè)置自動代碼提示的超詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05python3的數(shù)據(jù)類型及數(shù)據(jù)類型轉(zhuǎn)換實例詳解
在本文里小編給大家分享的是關(guān)于python3的數(shù)據(jù)類型及數(shù)據(jù)類型轉(zhuǎn)換以及相關(guān)實例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2019-08-08