关闭uwsgi和websockets的连接
假设我有一个基本的 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标准,而不需要向客户端发送额外的数据。