使用Python Web框架"quart"的Websockets?

3
我需要帮助理解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 上不起作用。

希望能得到帮助。

1个回答

7

当用于封装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():
    ...

Edit: I am the Quart author.


1
你好,欢迎来到 Stack Overflow!只要请注意,如果你想推广或推荐自己的产品/博客,那么我们有一些指南需要遵守。遵循这些指南将有助于避免给人一种垃圾信息的印象。你可以通过[编辑]明确说明你的关联。谢谢。(如果你实际上没有关联,也许值得提及一下。) - undefined
1
我已经编辑了声明我的Quart参与情况。但我不确定这个答案将会推广什么? - undefined
这是一个不错的编辑。这个推广将会宣传你自己的代码/博客... - undefined
我遇到了这个错误:第20行,在collect_websocket函数中 @wraps(func) NameError: 名称'wraps'未定义,有什么我遗漏的吗? - undefined
1
从functools模块导入wraps函数,可能需要查看文档(https://docs.python.org/3/library/functools.html#functools.wraps)。 - undefined
2
OP特别询问的是quart,所以那个编辑是不必要的。(如果问题没有指定框架,加上免责声明是有道理的,但这个问题已经指定了)。感谢你的辛勤工作,@pgjones。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接