WebSocket 可以讓 Server 與 瀏覽器之間建立一個持續、雙向且即時的資料傳輸通道。WebSocket 只需一次交握,就能讓雙方時主動暨傳資料,適合低延遲、高頻率更新的應用場景,比如聊天室、股市看盤軟体等。
uvicorn
runserver 不支援 WebSocket 協定,需改成 uvicorn 伺服器透過 asgi 介面才能啟動 WebSocket。
安裝套件
WebSocket 所需的套件如下。
在安裝 redis 時,必需降版到 5.x,因為 6.x 還不穩定,WebSocket 會很快就斷線。
pip install django channels channels-redis uvicorn pip install "redis<6"
新增網頁 app
本例使用類似 chatGpt 的聊天程式,請在網頁根目錄執行如下指令
python manager.py startapp robot
settings.py
settings.py 需裏增如下指令設定
ASGI_APPLICATION = 'mahalbot.asgi.application'#此行可以忽略,因為由啟動程式 uvicorn mahalbot.asgi:application 就指定了
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("127.0.0.1", 6379)],
},
},
}
asgi.py
asgi.py 修改 application 成如下設定
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(
chat.routing.websocket_urlpatterns
),
})
todo
nginx
nginx 需新增如下藍色部份設定
location / {
proxy_pass http://localhost:7001;
proxy_http_version 1.1;
proxy_set_header Host $http_host;#將客戶端的 HOST 傳入 Django
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#將客戶 ip 傳入Django
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
todo
啟動伺服器
使用如下指令啟動 uvicorn 伺服器
/server/mahalbot/.venv/bin/uvicorn mahalbot.asgi:application --host localhost --port 7001 --reload"
todo
