#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, он внезапно начал работать так, как я ожидал. Теперь я чувствую себя глупо, ха-ха