WebSocket使得客戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料。Sanic 提供了非常簡潔的 websockets 抽象,讓我們開發基於 WebSocket 的web應用非常容易。
WebSocket 例項
下面是一個簡單的建立 WebSocket 的例子:
from sanic import Sanic
from sanic.response import json
from sanic.websocket import WebSocketProtocol
app = Sanic()
@app.websocket('/feed')
async def feed(request, ws):
while True:
data = 'hello!'
print('Sending: ' + data)
await ws.send(data)
data = await ws.recv()
print('Received: ' + data)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8888, protocol=WebSocketProtocol)
上面這個app
建立一個 WebSocket 的服務。也可以用 app.add_websocket_route
方法替換裝飾器:
async def feed(request, ws):
pass
app.add_websocket_route(feed, '/feed')
WebSocket 路由的處理函式需要兩個引數,第一個是request
物件,第二個是 WebSocket 協議物件,這個協議物件有兩個方法send
和recv
用來傳送和接收資料。
WebSocket 的配置
通過app.config
來配置 WebSocket,比如:
app.config.WEBSOCKET_MAX_SIZE = 2 ** 20
app.config.WEBSOCKET_MAX_QUEUE = 32
app.config.WEBSOCKET_READ_LIMIT = 2 ** 16
app.config.WEBSOCKET_WRITE_LIMIT = 2 ** 16
閱讀Sanic 配置詳細瞭解Sanic的配置細節。
複雜的例子
通常我們的web應用既有普通的get
、post
,也有websocket
,比如下面這個例子:
from sanic import Sanic
from sanic.response import file
app = Sanic(__name__)
@app.route('/')
async def index(request):
return await file('websocket.html')
@app.websocket('/feed')
async def feed(request, ws):
while True:
data = 'hello!'
print('Sending: ' + data)
await ws.send(data)
data = await ws.recv()
print('Received: ' + data)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8888, debug=True)
這樣一個app
例項同時支援包括WebSocket在內的多種路由。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***