关闭与uWSGI和WebSockets的连接。

3
假设我有一个使用uWSGI的基本WebSocket应用程序:
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)

这个似乎可以工作,但是我收到了

TypeError: 'NoneType' object is not iterable

在uWSGI中,这种情况有点可以理解,因为它试图像在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

这种方法可以解决错误,但看起来像是一个恶意的hack。此外,我可能会遇到一些我不知道的副作用(uWSGI是否会向客户端发送任何内容?)。或者我错了吗?

那么如何正确处理这个问题?

1个回答

2

just

return ['']

通过这样做,您将完全符合WSGI标准,而无需向客户端发送任何额外的数据。


可以,太好了。你能告诉我你在哪里找到这个信息吗?我找不到它的来源。 - Mr.Coffee

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