使用 Flasksocketio.run(app)命令啟動 Flask 應用程式(根據)時,Flask SocketIO 服務器實作未接收客戶端訊息或事件觸發器:flask run(on http://127.0.0.1:5000)。
它只輸出 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通過呼叫create_app()定義在app/__init__.py. 該函式回傳一個包含 app 物件和 socketio 物件的元組,用于將這兩者按以下方式組合(in 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)
但是出于關注點分離的原因并盡可能地解耦應用程式,我想將服務器(編輯:服務器的處理功能)放在 中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.")
}
uj5u.com熱心網友回復:
所以,我已經連接了我的兩個腦細胞,并發現我的distributed_manager模塊是在socketio.run(app)呼叫之后和創建應用程式之后執行的,因此@socketio.on...必須在它之前定義函式,特別是在我的解決方案中app/__init__.py,它創建了應用程式和 socketio 物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406600.html
標籤:
