2

I am creating an Flask-socketio app, in which I want to send socket when an OSC message is received, in order to receive it into a web app thanks to socketio.js

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')

Even if I don't get error message, the socket is not receive from the javascript side, because the emit function is called in another thread, and there is conflicts with the request context.

I tried several things according to some other stackoverflow tickets :

socketio = SocketIO(app, async_mode='threading')

Adding this line before handler function

@copy_current_request_context

Or recreate a socketio instance into the callback

def answer_handler(addr, tags, stuff, source):

    socketio_connection = SocketIO(app)
    with app.app_context():
        socketio_connection.emit('tempo', 1)

But none of these solution is working, and I need to integrate solve this 'context' problem into my thread. Note that :

socketio.emit('tempo', 1)

is working great out of this thread , and received in the javascript part

0 Answers0