除app.py之外的模块中的Flask SocketIO事件



使用Flask命令flask run(在http://127.0.0.1:5000上(启动Flask应用程序(根据socketio.run(app)(时,Flask SocketIO服务器实现未接收客户端消息或事件触发器。

它只输出GET和POST轮询:

127.0.0.1 - - [04/Jan/2022 13:18:26] "GET /socket.io/?EIO=4&transport=polling&t=Nub1htW HTTP/1.1" 200 -
127.0.0.1 - - [04/Jan/2022 13:18:26] "POST /socket.io/?EIO=4&transport=polling&t=Nub1i2I&sid=ELpMQjSfqpcXN731AAAA HTTP/1.1" 200 -
127.0.0.1 - - [04/Jan/2022 13:18:26] "GET /socket.io/?EIO=4&transport=polling&t=Nub1i2J&sid=ELpMQjSfqpcXN731AAAA HTTP/1.1" 200 -

项目结构:

├── Flask Web App
│   ├── app
│   │   ├── common
│   │   ├── distributed_manager
│   │   │   ├── distributed_manager.py
│   │   │   └── __init__.py
│   │   ├── __init__.py
│   │   ├── local_settings.py
│   │   ├── models
│   │   ├── settings.py
│   │   ├── static
│   │   │   ├── css
│   │   │   ├── img
│   │   │   └── js
│   │   │       ├── chat.js
│   │   │       └── responses.js
│   │   ├── templates
│   │   ├── util.py
│   │   └── views
│   │       ├── bot_views.py
│   │       ├── error_views.py
│   │       ├── __init__.py
│   │       ├── main_views.py
│   │       └── site_views.py
│   ├── flask_app.py

应用程序在flask_app.py中通过调用app/__init__.py中定义的函数create_app()进行初始化。此函数返回一个包含应用程序对象和socketio对象的元组,用于以以下方式(在flask_app.py中(组合这两个对象:

from app import create_app
app, socketio = create_app()
if __name__ == "__main__":
socketio.run(app)

我通过以下方式在flask_app.py中放置事件处理函数来处理来自客户端的消息:

from app import create_app
app, socketio = create_app()

@socketio.on("connect")
def handle_connection():
print("Connected a client...")

@socketio.on("message")
def handle_message(msg):
print("Client message: " + msg)

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

但出于关注分离的原因,为了尽可能地解耦应用程序,我想将服务器(EDIT:处理服务器的功能(放在distributed_manager.py中,因为稍后我计划将消息作为请求传递到该模块中。

这是我的服务器(distributed_manager.py(:

from flask_socketio import send, emit
from flask_app import socketio

def ack_client():
print("Message was received by the client.")
@socketio.on("connect")
def handle_connection(message):
print("connected: " + message)

@socketio.on("message")
def handle_message(message):
print(f"Received message: {message}")

和客户端在chat.js:

var socket;
connectToSocket();
...
function connectToSocket(){
socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
socket.send('User has connected!');
});
// console.log("Connected to the socket.")
}

因此,我已经连接了我的两个脑细胞,并发现我的distributed_manager模块是在socketio.run(app)调用后和创建应用程序后执行的,因此必须在它之前定义@socketio.on...函数,特别是在我在app/__init__.py中的解决方案中,它创建了应用程序和socketio对象。

最新更新