最後一篇簡短的介紹 channels 。
說到 Channels ,得先談到 WebSocket,WebSocket 與一般 HTTP 最大的不同點是,透過 WebSocket 協定,服務器端可以主動向客戶端瀏覽器推送資料,也就是說服務器端不再是被動等待 HTTP 請求才能做事了。客戶端瀏覽器也因此可以跟服務器端做永久連接,並進行雙向的資料傳輸。
Django 原本只有單純的 HTTP 能力,也就是只能被動等待 HTTP 請求,做出回應。透過 Channels 的擴充,讓 Django 可以處理 WebSockets 或是 IoT (MQTT)等協定。
專案網址:https://channels.readthedocs.io/en/latest/
教學文件:https://channels.readthedocs.io/en/latest/tutorial/index.html
基本上依照教學,很快就可以完成簡單的聊天室。所以這邊我不多做著墨,而是講一下佈署的部份。
照一般 Django 應用程式來說,使用 gunicorn 就可以了,但用了 channels 以後,則需要啟動一個 ASGI Server - daphne 。daphne 除了可以處理 HTTP/WSGI 請求之外,也可以處理 ASGI 請求。不過,daphne 處理 HTTP/WSGI 請求的效能不是非常好,我自己在使用時,仍然把 HTTP/WSGI 請求轉給 gunicorn 來處理。
那這樣做的缺點就是 nginx 得多寫設定,讓 WebSocket 的請求到 daphne 那邊去,原來的 HTTP 請求到 gunicorn 那邊去。
# nginx config example
location @proxy_to_ws {
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Connection "";
proxy_redirect off;
proxy_read_timeout 300s;
proxy_pass http://daphne_server;
# For websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
location @proxy_to_app {
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Connection "";
proxy_redirect off;
proxy_read_timeout {{app_proxy_read_timeout}}s;
proxy_pass http://gunicorn_server;
proxy_http_version 1.1;
}
再來就是 WebSocket 的連線是持續的,從這點來考量,就需要考慮以下幾點:
大致上就是這樣子,有時間再來把這邊寫的更詳細些。
轉眼,九月也到 30 日,也順利的把以前用過的套件都整理過一次。最後,謝謝大家的閱讀,如果有不好的地方請不吝留言告知,謝謝。