Sanic WebSocket 使用

veelion發表於2019-04-09

WebSocket使得客戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料。Sanic 提供了非常簡潔的 websockets 抽象,讓我們開發基於 WebSocket 的web應用非常容易。

Sanic WebSocket 使用

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 協議物件,這個協議物件有兩個方法sendrecv用來傳送和接收資料。

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應用既有普通的getpost,也有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在內的多種路由。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章