带有python web框架“夸脱”的Websockets?

时间:2018-04-15 00:02:25

标签: python flask python-asyncio quart

我需要有关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)

source

但这不适用于夸脱网页套件。

帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

此装饰器用于包装websocket处理程序时,将从connected集添加和删除websockets。需要使用websocket的_get_current_object方法来获取当前context中的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的作者。