假设我有一个使用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是否会向客户端发送任何内容?)。或者我错了吗?
那么如何正确处理这个问题?