2

我需要有关 python web 框架工作Quart的帮助,更具体地说是 websockets。我希望能够在连接时注册客户端(将其添加到 python 列表中),并在断开连接时取消注册(将其从 python 列表中删除)。我在网上能找到的最接近的是这段代码:

connected = set()

async def handler(websocket, path):
    global connected
    # Register.
    connected.add(websocket)
    try:
        # Implement logic here.
        await asyncio.wait([ws.send("Hello!") for ws in connected])
        await asyncio.sleep(10)
    finally:
        # Unregister.
        connected.remove(websocket)

资源

但这不适用于 quart websockets。

帮助将不胜感激。

4

1 回答 1

6

当用于包装 websocket 处理程序时,此装饰器将从connected集合中添加和删除 websocket。需要使用 websocket的_get_current_object方法来获取当前上下文中的 websocket ,并且需要 try-finally 来确保移除 websocket,而不管引发任何错误。请注意app.websocket必须包装(之前)的collect_websocket用法。

from functools import wraps

connected = set()

def collect_websocket(func):
    @wraps(func)
    async def wrapper(*args, **kwargs):
        global connected
        connected.add(websocket._get_current_object())
        try:
            return await func(*args, **kwargs)
        finally:
            connected.remove(websocket._get_current_object())
    return wrapper                                                                                                                                                                                                            


@app.websocket('/ws')                                                                                                                                                                                       
@collect_websocket
async def ws():
    ...

编辑:我是 Quart 作者。

于 2018-04-15T11:16:18.823 回答