Websockets#

Sanic 在 websockets 之上提供了易于使用的抽象。

路由#

Websocket 处理程序可以像常规处理程序一样挂接到路由器。

from sanic import Request, Websocket

async def feed(request: Request, ws: Websocket):
    pass

app.add_websocket_route(feed, "/feed")
from sanic import Request, Websocket

@app.websocket("/feed")
async def feed(request: Request, ws: Websocket):
    pass

Websocket 处理器#

通常,websocket 处理程序会希望保持一个循环打开。

然后,它可以在注入到处理程序的第二个对象上使用 send()recv() 方法。

这个例子是简单的端点,它将收到的客户端消息回显回去。

from sanic import Request, Websocket

@app.websocket("/feed")
async def feed(request: Request, ws: Websocket):
    while True:
        data = "hello!"
        print("Sending: " + data)
        await ws.send(data)
        data = await ws.recv()
        print("Received: " + data)

你可以通过在 for 循环中迭代 Websocket 对象来简化你的循环。

from sanic import Request, Websocket

@app.websocket("/feed")
async def feed(request: Request, ws: Websocket):
    async for msg in ws:
        await ws.send(msg)

Websocket 默认配置#

app.config.WEBSOCKET_MAX_SIZE = 2 ** 20
app.config.WEBSOCKET_PING_INTERVAL = 20
app.config.WEBSOCKET_PING_TIMEOUT = 20