与uwsgi和websockets紧密相连

时间:2014-07-07 14:51:50

标签: python websocket uwsgi

假设我使用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中的

,这是可以理解的,因为它尝试迭代application(...)就像通过HTTP(兼容性??)一样。为了避免这种情况,我最后添加了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 个答案:

答案 0 :(得分:2)

只是

return ['']

并且您将完全符合WSGI,而无需向客户端发送其他数据

相关问题