天天看點

如何在Starlette中設定WebSockets

作者:SuperOps

WebSockets是向網站使用者發送實時更新的極好方法。在這篇文章中,我們将向你展示如何在基于Starlette的web應用程式中設定websockets。

WebSockets是什麼?

在基本級别上,WebSockets表示客戶機和伺服器之間的雙向連接配接,這意味着客戶機和伺服器都能夠互相發送消息。當建立這樣的連接配接時,用戶端首先打開到伺服器的“正常”HTTP連接配接,然後請求伺服器将連接配接“更新”為WebSocket連接配接。

伺服器可能接受也可能不接受此更新請求,這取決于後端運作的是什麼軟體。在Python生态系統中,Django使用channels包支援WebSockets。在撰寫本文時,這個包是一個官方的Django項目,但并不包含在預設的Django發行版中。

Starlette從v0.6.0開始支援WebSockets。在這篇博文中,我們将看到如何使用Starlette編寫一個簡單的WebSockets伺服器。

Starlette HTTP端點

讓我們從一個普通的web伺服器開始讨論。

在Starlette應用程式中,可以通過映射到URL的Endpoint通路伺服器上的所有内容。端點可以被認為是一個表示使用者請求的類。HTTP資源尤其可以通過HTTPEndpoint獲得。

讓我們快速看看一個非常簡單的Starlette應用程式:

如何在Starlette中設定WebSockets

将上面的代碼放在一個名為main.py的檔案中,并使用uvicorn main:instance——port 8000運作它。您應該能夠在浏覽器中通路http://localhost:8000/hello,并看到螢幕上寫着的壯觀的“Hello, World!”消息。

在本例中,HelloEndpoint是一個“普通的”HTTP端點。由于WebSocket連接配接的工作方式略有不同,Starlette為編寫這樣的端點提供了一個特殊的基類。讓我們接下來探讨這個問題。

Starlette WebSocket端點

正如我們前面提到的,WebSocket連接配接與普通連接配接稍有不同。出于這個原因,Starlette提供了一個不同的基本端點類供您擴充,該類被恰當地稱為WebSocketEndpoint。

讓我們使用這個類在前一個示例中的伺服器上添加另一個端點,該端點将響應WebSocket連接配接。

如何在Starlette中設定WebSockets

正如您所看到的,WSEndpoint類看起來與我們之前的基于httpendpoint的類有點不同。其中一個不同之處是沒有get或post處理程式方法。相反,我們有on_connect、on_receive和on_disconnect。這三個方法大緻對應客戶機WebSocket連接配接的生命周期階段。

on_connect

每當新客戶機連接配接到伺服器時,架構就會調用on_connect方法。它接受一個表示連接配接對象本身的websocket參數。調用websocket.accept()讓伺服器接受用戶端的連接配接請求。

on_receive

on_receive方法是主要通信發生的地方。每當客戶機向伺服器發送任何資料時,将調用此方法以及作為參數傳遞的已發送資料。

在上面的例子中,我們要求伺服器向用戶端傳回一個簡單的“OK!”,作為對用戶端所說的任何事情的一般響應。

on_disconnect

Starlette在客戶機/伺服器連接配接關閉時調用on_disconnect方法。如果您希望伺服器在用戶端斷開連接配接後執行任何清理,這是調整的方法。

close_code參數也被傳遞給該方法,其中包含關閉連接配接的原因。您可能想知道的所有可能的關閉代碼的完整清單在星号中。子產品狀态。如果您想根據應用程式的性質調整清理代碼,這是很有幫助的。

基本上就是這樣!隻需要幾行代碼,我們就建構了一個可用于生産的WebSocket伺服器,它能夠與多個客戶機實時通信!

測試WebSocket連接配接

在結束之前,讓我們快速了解一下如何測試整個設定。

當然,我們可以編寫一些HTML和JavaScript代碼,從浏覽器通過WebSocket連接配接連接配接到我們的後端,并在客戶機和伺服器之間來回發送一些消息,以確定一切都按預期工作。這将是一個完全有效的測試方法。

讓我們試試不同的東西。讓我們試着多了解一點Starlette,并使用它的測試功能來確定我們的WebSocket伺服器按預期工作。

Starlette提供了一個TestClient類,用作HTTP用戶端。顧名思義,我們通常在編寫應用程式測試時使用這個類。我們将為這篇部落格文章做一個例外,使用這個類與我們的WebSocket伺服器通信。

如何在Starlette中設定WebSockets

正如我們所看到的,這個代碼片段使用我們在主應用程式檔案中構造的Starlette應用程式執行個體執行個體化了一個TestClient。然後我們使用websocket_connect上下文管理器來擷取一個websocket對象,我們可以用它來與伺服器通信。連接配接建立後,我們要做的第一件事是向伺服器發送一個“Hello!”,然後等待伺服器發回一些東西。在下一行中,我們列印從伺服器傳回的内容。

将這段代碼粘貼到一個名為ws_test.py的檔案中,并使用python ws_test.py運作它。你應該會看到類似如下的輸出行:

如何在Starlette中設定WebSockets

輸出的第一行和最後一行是我們在端點定義中調用logger.info的日志消息。第二行是伺服器傳回的“OK!”消息。

結論

WebSockets是一項非常有用的技術,它可以幫助您實作豐富的終端使用者體驗。

能夠将資料從伺服器推送到客戶機,而不是客戶機總是需要向伺服器請求資料,這是非常強大的功能。建構聊天應用程式是WebSockets啟用的一個經典用例,但WebSockets應用的用例數量可能是無限的。

Starlette是一個原生支援該技術的Python架構。是以,如果您正在建構一個SaaS,這是您應該考慮使用Starlette的另一個原因!

繼續閱讀