我正在创建一个 Flask-socketio 应用程序,我想在收到 OSC 消息时发送套接字,以便通过 socketio.js 将其接收到 Web 应用程序中
from flask import Flask, render_template, copy_current_request_context, current_app
from flask_socketio import SocketIO, emit, send
from OSC import OSCClient, OSCMessage, OSCServer
import time, threading
app = Flask(__name__)
socketio = SocketIO(app)
client = OSCClient()
client.connect( ("localhost", 62345))
receive_address = ('localhost', 62346)
server = OSCServer(receive_address)
# simple callback functions
def answer_handler(addr, tags, stuff, source):
with app.app_context():
socketio.emit('tempo', 1)
# adding callback functions to listener
server.addMsgHandler("/puredata", answer_handler)
if __name__ == '__main__':
#Start OSCServer in extra thread
st = threading.Thread( target = server.serve_forever )
st.daemon = True
st.start()
print('OSC server is started')
socketio.run(app, host='0.0.0.0')
即使我没有收到错误消息,套接字也没有从 javascript 端接收,因为在另一个线程中调用了发出函数,并且与请求上下文存在冲突。
我根据其他一些stackoverflow票尝试了几件事:
socketio = SocketIO(app, async_mode='threading')
在处理函数之前添加这一行
@copy_current_request_context
或者在回调中重新创建一个 socketio 实例
def answer_handler(addr, tags, stuff, source):
socketio_connection = SocketIO(app)
with app.app_context():
socketio_connection.emit('tempo', 1)
但是这些解决方案都不起作用,我需要将解决这个“上下文”问题集成到我的线程中。注意 :
socketio.emit('tempo', 1)
在这个线程中工作得很好,并在 javascript 部分中收到