Try   HackMD

2018 PyConTW Talk - Easy way to build a real time and asynchronous web or app with Django Channels

Abstract

Django 是 Python 其中一個非常流行的網站框架,它採取傳統的視圖做法並且圍繞在:一個請求進來,Django 被觸發並服務,接著回應並送出,然後 Django 繼續等待。但現在的網站除了使用這種傳統的輪詢(polling)方法外還包含 WebSocket, HTTP2 等等技術,這也讓現代網站可以透過這些技術建造一個真正的 Real-time web。而 Channels 是讓 Django 具備這些技術的套件之一。

Channels 是一個官方維護的套件,未來預計會整合進入 Django framework(但原整合入 Django 2 計畫確定延遲)。Channels 1 在 2017 年初就已經正式發佈,近期更新的 Channels 2 則做了幾項重大的調整與改變:其中關於 asynchronous 部分使用 Python's asyncio library,這也意味著 Channels 2 確定無法向下支援 Python 3.4 與 Python 2.7 之前的版本。因此在這場演講將會著重在分享 Channels 改變的部分與其細節並且包含"改寫"(說明 1 與 2 差異)與"建置"一個 Django Channels 的 web 與 app。

參與街口支付的搶紅包活動,公測時發現網站似乎以傳統的 request 與 response 來處理與回應資料造成網站無法承受瞬間使用者不斷重送的請求,想展示能否採取 Channels 來實作讓效能以及使用者體驗更好。

Outline

  1. 傳統 polling 與 Real-time web 運作方式 [2 mins]
    • WSGI and HTTP
    • WebSocket and HTTP2
  2. Python 裡的 WebSockets 方案 [5 mins]
    • Frameworks/web: Twisted, Tornado
    • Async engines with websocket servers: gevent
    • Support WSGI Server: uWSGI
  3. Synchronous 與 Asynchronous 簡介 [10 mins]
    • non-blocking sockets
    • callback
    • event loop
        - Python's asyncio library
  4. Channels and Django and how to build a web with those [20 mins]
    • ASGI (Asynchronous Server Gateway Interfac) and Daphne
        - Channels layer, Event-driven and redis
    • Channels 1 v.s Channels 2
    • Sample code
  5. Demo 與 Q&A [8 mins]
    • 搶紅包網站(可能有其他再補上)

傳統 polling 與 Real-time web 運作方式

傳統網頁是採取 request/pool 這被稱為 polling(輪播),因其採取方法是 client 端(或是稱為使用者端)與 server 去詢問資料,這是一種單向方法。其實開使用這種簡單方法也不怪,試著思考最早是以 html 的靜態網頁組成的單純網際網路(真是單純的美好啊)因此使用者加載了一個頁面到瀏覽器接著什麼也不會在執行直到使用者去點擊任何其它頁面。
但 2005 年開始 AJAX 引入,才讓大家開始思索雙向連接,但 AJAX 也並非真正雙向,所有的 HTTP 還是透過客戶端操作,透過交互週期的輪播來加載資料,那 AJAX 達到這種假的雙向錯覺是使用一種長輪播的方法:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

但是這樣方式開銷很大,且不適合低延遲的運用(想想打一個網頁槍戰遊戲,你這樣可以大吉大利一起吃雞嗎?)。
全雙通既然是個理想,當然也一定會被實作出來,RFC-6455 WebSocket 協議制定之後 Real-time 網頁實際上也就正式成為網頁開發方法的選項之一。

Python 裡的 WebSockets 方案

Synchronous 與 Asynchronous 簡介

Channels and Django and how to build a web with those

提到 Channels 會先提關於 Concurrency 並行是什麼?與 CSP

Demo 與 Q&A