关闭uwsgi和websockets的连接

3 投票
1 回答
1304 浏览
提问于 2025-04-18 12:21

假设我有一个基本的 WebSocket 应用程序,使用的是 uWSGI:

def application(env, res):
    uwsgi.websocket_handshake(env["HTTP_SEC_WEBSOCKET_KEY"], env.get("HTTP_ORIGIN", ""))
    while True:
        msg = uwsgi.websocket_recv()
        uwsgi.websocket_send("OK: " + msg)

我该如何优雅地关闭客户端呢?比如当我执行

def application(env, res):
    uwsgi.websocket_handshake(env["HTTP_SEC_WEBSOCKET_KEY"], env.get("HTTP_ORIGIN", ""))
    while True:
        msg = uwsgi.websocket_recv()
        if msg == "exit":
            break
        uwsgi.websocket_send("OK: " + msg)

这样做似乎有效,但我在 uWSGI 中收到了

TypeError: 'NoneType' object is not iterable

这有点可以理解,因为它试图像处理 HTTP 一样去处理 application(...)(是为了兼容吗??)。为了避免这个问题,我在最后加了 yield None

def application(env, res):
    uwsgi.websocket_handshake(env["HTTP_SEC_WEBSOCKET_KEY"], env.get("HTTP_ORIGIN", ""))
    while True:
        msg = uwsgi.websocket_recv()
        if msg == "exit":
            break
        uwsgi.websocket_send("OK: " + msg)
    yield None

这虽然解决了错误,但看起来像是个不太好的解决办法。此外,可能还有一些我不知道的副作用(uWSGI 是否还是会给客户端发送什么东西??)。或者我理解错了?

那么,应该如何正确处理这个问题呢?

1 个回答

2

只需要这样做

return ['']

你就能完全符合WSGI标准,而不需要向客户端发送额外的数据。

撰写回答