如何在请求和应用程序上下文之外将消息发送到flask-socketio客户端?

时间:2019-07-25 13:36:13

标签: python-2.7 flask socket.io flask-socketio

我正在运行一个python Web服务器,将eventlet用于WSGI,并带有flask和flask-socketio。一个网页通过HTTPS提供给客户端,该网页使用socketio启动与服务器的websocket连接。

建立套接字连接后,客户端会向服务器发送一条消息,询问某些状态。服务器收到此消息,并使用send(sign_config)将消息发送回服务器。

所有这些工作。

但是,我使用socketio的原因是,有时服务器端的状态会发生变化,这需要推送到客户端。我已经尝试了多种不同的方法,但都失败了,但这是我目前正在尝试的方法:

with self.app.app_context():
    self.socketio.send(sign_config, room = sid)

我不确定是否需要app_context()。无论是否存在,我都不会例外。无论哪种方式,send函数都不会生成任何异常。但是,客户端未收到该消息。此外,对服务器的下一个套接字请求失败。短时间后,客户端将使用新的sid重新建立与服务器的连接。简而言之,发送此消息似乎会终止websocket连接,或者至少使某些内容不同步。我确定我使用的sid是正确的。

这基本上是实际设置环境的代码:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'asdf'
socketio = flask_socketio.SocketIO(app)
socketio.run(app, host = '0.0.0.0', port = 443, certfile = cert_path, keyfile = key_path_result, ssl_version = ssl.PROTOCOL_TLS)

app和socketio对象被传递到处理这些内容的另一个类,这就是为什么上面的代码是self.app和self.socketio的原因。但是它们是相同的对象。

有人知道这里会发生什么吗?

编辑,我尝试过的其他一些事情:

# This produces no exception, but fails to send and breaks websocket connection
with self.app.app_context():
    self.socketio.send(sign_config, namespace = '/', room = sid)

# This produces no exception, but fails to send and breaks websocket connection
with self.app.app_context():
    send(sign_config, namespace = '/', room = sid)

# This produces no exception, but fails to send and breaks websocket connection
self.socketio.send(sign_config, namespace = '/', room = sid)

1 个答案:

答案 0 :(得分:1)

要发送没有请求上下文的事件,您必须同时指定房间和名称空间。如果缺少这两者之一,则将尝试从请求上下文中获取,这就是您遇到错误的时候了。