我正在运行一个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)
答案 0 :(得分:1)
要发送没有请求上下文的事件,您必须同时指定房间和名称空间。如果缺少这两者之一,则将尝试从请求上下文中获取,这就是您遇到错误的时候了。