使用 RxPY 处理基于推送的事件的 Python Flask 服务器中的 websocket 断开连接

Handling websocket disconnect in Python Flask server using RxPY for push based events

上下文

我正在使用 RxPY 来启用通过 websockets 发送基于推送的事件。我在带有 geventFlask 服务器中使用 flask-sockets。事件 class 包含充当事件发布者的 rx.subject.BehaviorSubject,而 websocket 客户端订阅更改。

问题

我希望能够检测到客户端何时断开连接,以便我可以正确处理资源。问题是当套接字断开连接并且 ws.send 抛出异常但它在 lambda 内部。

解决方案?

有没有办法将异常传递给父函数?

另一种解决方案是在不调用 ws.send 的情况下检测 websocket 断开连接,这可以在 lambda 之外进行检查,尽管我在 flask-sockets图书馆。

@sockets.route('/ws/events')
def wsEvents(ws):
    sub = None
    disp = None
    try:
        print("socket opened")
        def update_fn(x):
            print(x) 
            ws.send(json.dumps(x))

        sub = events.get_sub(None)

        if sub is not None:
            disp = sub.subscribe(lambda x: update_fn(x))
        else:
            raise Exception('Undefined sub') 

        while not ws.closed:
            gevent.sleep(1)
            pass

    except Exception as e:
        print(e) 

    finally:
        print("socket closed")
        if disp is not None:
            disp.dispose()

我找到了一个解决方法,使用 gevent 超时方法检测套接字断开连接事件,如下所示:

while not ws.closed:
    gevent.sleep(0.1)
    try:
        data = gevent.with_timeout(0.1, ws.receive, timeout_value="")
        if data is None:
            raise Exception("socket closed")
    except:
        break

现在可以在套接字断开事件上将资源作为方法 returns None 处理。