使用dwebsocket在Django中使用Websocket
一 什麼是Websocket
WebSocket是一種在單個TCP連線上進行全雙工通訊的協議
WebSocket使得客戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料。在WebSocket API中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以建立永續性的連線,並進行雙向資料傳輸
現在,很多網站為了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP請求,然後由伺服器返回最新的資料給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向伺服器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的資料可能只是很小的一部分,顯然這樣會浪費很多的頻寬等資源。
而比較新的技術去做輪詢的效果是Comet。這種技術雖然可以雙向通訊,但依然需要反覆發出請求。而且在Comet中,普遍採用的長連結,也會消耗伺服器資源。
在這種情況下,HTML5定義了WebSocket協議,能更好的節省伺服器資源和頻寬,並且能夠更實時地進行通訊
二 Django實現Websocket
django實現websocket大致上有兩種方式,一種channels,一種是dwebsocket。channels依賴於redis,twisted等,相比之下使用dwebsocket要更為方便一些
三 dwebsocket安裝
pip3 install dwebsocket
四 dwebsocket配置
setting 設定
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() 方法傳送資料
ws.send("傳送資料");
alert("資料傳送中...");
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
alert("資料已接收...");
alert("資料:" + received_msg)
};
ws.onclose = function () {
// 關閉 websocket
alert("連線已關閉...");
};
}
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裝飾器會導致檢視函式無法接收導致正常的http請求,一般情況使用accept_websocket方式就可以了,
dwebsocket的一些內建方法:
request.is_websocket():判斷請求是否是websocket方式,是返回true,否則返回false
request.websocket: 當請求為websocket的時候,會在request中增加一個websocket屬性,
WebSocket.wait() 返回客戶端傳送的一條訊息,沒有收到訊息則會導致阻塞
WebSocket.read() 和wait一樣可以接受返回的訊息,只是這種是非阻塞的,沒有訊息返回None
WebSocket.count_messages()返回訊息的數量
WebSocket.has_messages()返回是否有新的訊息過來
WebSocket.send(message)像客戶端傳送訊息,message為byte型別
未測試,看著是可以的。
原文連結:使用dwebsocket在Django中使用Websocket
七、Linux下websocketd的安裝及使用
下載:
wget https://github.com/joewalnes/websocketd/releases/download/v0.2.12/websocketd-0.2.12-linux_amd64.zip
解壓:
unzip websocketd-0.2.12-linux_amd64.zip
//除了websocketd之外可刪除。
移動:
mv websocketd /usr/bin/websocketd
配置全域性變數:
(1)vim /etc/profile
(2)新增:export PATH=$PATH:/usr/bin/websocketd
啟動:
websocketd --port=8080 (php echo.php | bash echo.sh)
相關文章
- python測試開發django-81.dwebsocket實現websocketPythonDjangoWeb
- Django使用Channels實現WebSocket--下篇DjangoWeb
- Django使用Channels實現WebSocket--上篇DjangoWeb
- Django3使用WebSocket實現WebShellDjangoWebshell
- Django使用channels實現Websocket連線DjangoWeb
- 你知道在springboot中如何使用WebSocket嗎Spring BootWeb
- 在django如何使用中文Django
- 在django中使用celeryDjango
- 在Django中使用Channels功能Django
- django中orm的使用DjangoORM
- 在 go websocket server 與 javascript websocket client 互動中使用 flatbuffersGoWebServerJavaScriptclient
- celery 在django專案中使用Django
- 使用Django-Channels實現websocket通訊+大模型對話DjangoWeb大模型
- Java中Websocket使用例項解讀JavaWeb
- Sanic WebSocket 使用Web
- websocket使用(vue)WebVue
- websocket初次使用Web
- 在 django 中使用 firebase 傳送通知Django
- 在django中使用celery(而不是djcelery)Django
- 【Python】在Django中使用Q()物件PythonDjango物件
- Django中F函式的使用Django函式
- websocket使用小例子Web
- Django中content_type的使用Django
- python django中restful框架的使用PythonDjangoREST框架
- Django 中 Aggregation聚合的使用Django
- 在vue中使用SockJS實現webSocket通訊VueJSWeb
- 在centos8使用Docker部署Django專案CentOSDockerDjango
- SpringBoot使用WebSocketSpring BootWeb
- OkHttp使用分析—WebSocket篇HTTPWeb
- Django中 render() 函式的使用方法Django函式
- 記錄在使用Django開發過程中遇到的問題No.2Django
- 在 Django 中使用 Celery 來進行耗時操作Django
- Django中使用ElasticSearchDjangoElasticsearch
- django中使用celeryDjango
- django專案使用Django
- 【譯】 WebSocket 協議第十二章——使用其他規範中的WebSocket協議Web協議
- NestJS WebSocket 開始使用JSWeb
- 手摸手教你使用WebSocket[其實WebSocket也不難]Web