python flask-сервер socketio получает сообщение, но не запускает событие

#python #flask #socket.io #flask-socketio

Вопрос:

Я использую flask и socketio для создания системы связи сервер-клиент. Упрощенная версия этого ниже, которая повторяет проблему, с которой я сталкиваюсь. В принципе, клиент может подключиться к серверу и может отправлять сообщения и получать подтверждения в ответ, однако сообщения, похоже, не запускают функции обработчика на сервере. В приведенном ниже примере я ожидаю, что сервер «ПОЛУЧИЛ: {} {}» в журналах, как он должен вызывать handle_message метод, но там ничего нет, несмотря на то, что в нем конкретно говорится, что он получил событие «тест». Я перепробовал несколько различных итераций и версий, чтобы попытаться понять, что происходит, но я понятия не имею, в чем причина проблемы. Любая помощь, которую вы можете оказать, будет очень признательна! Спасибо!

test_simple.py:

 import sys
import time
from flask import Flask
from flask_socketio import SocketIO
import socketio as sio
from socketio import Client

app = Flask(__name__)
socket = SocketIO(app, engineio_logger=True, logger=True)

@socket.on('test')  ## try decorator as .on_event isn't working
def handle_message(*args, **kwargs):
    print('RECEIVED: ', args, kwargs)
    app.logger.error(f'RECEIVED: {args}, {kwargs}')
    socket.emit('reply', 'hello client')
    return 'hello client'

def message_callback(*args, **kwargs):
    print('CALLBACK: ', args, kwargs)

def startup_server():
    #app = Flask(__name__)
    #socket = SocketIO(app, cors_allowed_origins="*",
    #                  engineio_logger=True, logger=True)
    #socket.on_event('test', handle_message)   # this doesn't work either
    #socket.on_event('message', handle_message)
    socket.run(app, host='127.0.0.1', port=8001, debug=True,
               use_reloader=False)

def startup_client():
    socket = Client(logger=True, engineio_logger=True)
    socket.connect('http://127.0.0.1:8001')
    socket.on('reply', message_callback)
    socket.emit('test', data='hello world', callback=message_callback)
    time.sleep(5)
    #socket.send(data='hello message', callback=message_callback)
    #time.sleep(5)
    socket.disconnect()

if __name__ == '__main__':

    if sys.argv[1] == 'predictor':
        startup_client()
    else:
        startup_server()
 

Журналы сервера:

python3 test_simple.py aggregator

 Server initialized for gevent.
54Pavf_I3leodKsoAAAA: Sending packet OPEN data {'sid': '54Pavf_I3leodKsoAAAA', 'upgrades': ['websocket'], 'pingTimeout': 20000, 'pingInterval': 25000}
54Pavf_I3leodKsoAAAA: Received request to upgrade to websocket
54Pavf_I3leodKsoAAAA: Upgrade to websocket successful
54Pavf_I3leodKsoAAAA: Received packet MESSAGE data 0
54Pavf_I3leodKsoAAAA: Sending packet MESSAGE data 0{"sid":"xH33UEQVeWzMXauFAAAB"}
54Pavf_I3leodKsoAAAA: Received packet MESSAGE data 21["test","hello world"]
received event "test" from xH33UEQVeWzMXauFAAAB [/]
### << expecting 'RECEIVED: {} {}' here >> ###
54Pavf_I3leodKsoAAAA: Sending packet MESSAGE data 31["",400]
 

Журналы клиентов:

python3 test_simple.py predictor

 Server initialized for gevent.
Attempting polling connection to http://127.0.0.1:8001/socket.io/?transport=pollingamp;EIO=4
Polling connection accepted with {'sid': '54Pavf_I3leodKsoAAAA', 'upgrades': ['websocket'], 'pingTimeout': 20000, 'pingInterval': 25000}
Engine.IO connection established
Sending packet MESSAGE data 0
Attempting WebSocket upgrade to ws://127.0.0.1:8001/socket.io/?transport=websocketamp;EIO=4
WebSocket upgrade was successful
Received packet NOOP data 
Received packet MESSAGE data 0{"sid":"xH33UEQVeWzMXauFAAAB"}
Namespace / is connected
Emitting event "test" [/]
Sending packet MESSAGE data 21["test","hello world"]
Received packet MESSAGE data 31["",400]
Received ack [/]
CALLBACK:  ('', 400) {}  ## << expected to receive 'hello client' >> ##
## << no 'reply' event trigger >> ##
 

Комментарии:

1. Я не уверен, в чем проблема с вашей стороны, потому что ваш код был хорош для меня, когда я его запускал. И сообщение, и обратный вызов запущены.

2. Вот чего я боялся… хм, ну, спасибо, что хотя бы попытались! Могу я спросить, какие версии колбы/колбы-сокетио/сокетио вы используете? Я начинаю думать, что это проблема совместимости версий, но я не уверен, какой пакет/версия вызывает конфликт

Ответ №1:

Решил эту проблему — спасибо за вашу помощь, Мигель! Проблема заключалась в версиях пакетов; Я использовал Flask 1.1.2 и Flask-SocketIO 4.3.1, которые, как я не осознавал, были отдельным пакетом, и я только пытался обновить Flask (и socketio-клиент, но я уже использовал самую обновленную версию этого). Как только я обновился до Flask 2.0.1 и Flask-SocketIO 5.1.0, он внезапно начал работать так, как я ожидал. Теперь я чувствую себя глупо, ха-ха