Flask-SocketIO: передать сокет всем клиентам вне контекста

С помощью Flask-MQTT и Flask-SocketIO я пытаюсь отправить сообщение сокета из контекста события Flask-SocketIO всем подключенным клиентам после получения сообщения MQTT. Тем не менее, при этом кажется, что сообщения никогда не достигают клиентов.

Похоже, это был длинный известно issue, но использование app.app_context() мне тоже не подходит.

Вот что у меня есть на данный момент:

app = Flask(__name__)

[app.config ...]

cors = CORS(app,resources={ "/*": {"origins":"*"} })
mqtt = Mqtt(app)
socketio = SocketIO(app)

[...]

@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
    with app.app_context():
        # Send socket to all connected clients.
        # Not working for some reasons...
        socketio.emit("mqtt_message")

@socketio.on("connect")
def handle_socketio_connect():
    # This works.
    emit("hello")

if __name__ == "__main__":
    socketio.run(app, [...] )

Версии пакетов:

  • Flask-SocketIO, 3.0.1
  • Колба-MQTT, 1.0.3
  • Ивентлет, 0.23.0

person Alexis Facques    schedule 05.07.2018    source источник
comment
Это работает, если вы удалите eventlet? Я подозреваю, что MQTT и Eventlet несовместимы. Если удаление eventlet заставляет ваше приложение работать, я предлагаю вам попробовать установить его обратно и добавить исправление обезьяны, чтобы увидеть, поможет ли это (см. eventlet.net/doc/)   -  person Miguel    schedule 07.07.2018
comment
Я попробую это как можно скорее, спасибо за вашу помощь!   -  person Alexis Facques    schedule 08.07.2018