python - python flask-socketio 服务器收到消息但不触发事件
问题描述
我正在使用flask 和socketio 来构建服务器-客户端通信系统。下面是它的简化版本,它复制了我遇到的问题。基本上,客户端可以连接到服务器并可以发送消息并接收回确认,但是这些消息似乎不会触发服务器上的处理函数。在下面的示例中,我希望服务器在日志中有 'RECEIVED: {} {}',因为它应该调用该handle_message
方法,但是什么也没有,尽管它特别说它收到了 'test' 事件。我尝试了一些不同的迭代和版本来试图弄清楚发生了什么,但我不知道是什么导致了这个问题。您能提供的任何帮助将不胜感激!谢谢!
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=polling&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=websocket&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 >> ##
解决方案
解决了 - 感谢您的帮助米格尔!问题是软件包版本;我使用的是 Flask 1.1.2 和 Flask-SocketIO 4.3.1,我没有意识到这是一个单独的包,我只尝试更新 Flask(和 socketio-client,但我已经在使用最更新的日期版本)。一旦我也更新到 Flask 2.0.1 和 Flask-SocketIO 5.1.0,它突然开始像我预期的那样工作。现在感觉自己傻了,哈哈
推荐阅读
- ruby - 当我尝试在 ruby 中复制工作表 google-api-client-0.30.2 时出现“服务器错误(Google::Apis::ServerError)”
- javascript - 渲染从 JSX 后端获取的 HTML 标记
- opengl - Vulkan 中的 OpenGL GLSL 原子计数器
- python-3.x - 通过 SQLAlchemy 方言查询 Crate 数据库:没有更多可用的服务器
- android - 仅当 ROOM 数据库中的行被删除时,如何显示 Toast?
- ios - 获取自己的蓝牙唯一 ID
- c# - 用于查找我的设备是否支持蜂窝连接的 API
- node.js - '@sailshq/socket.io-redis@latest' 不在 npm 注册表中
- javascript - Laravel 5.8 Pure Javascript Fetch AJAX PromiseStatus 返回被拒绝
- python-3.x - 即使 python 中的字符串是不可变的,该 sort 或 sorted 函数是如何工作的?