【发布时间】:2022-02-10 00:35:16
【问题描述】:
我正在尝试使用源自 python 后端的 socket.io 将消息发送到前端。我能够注册前端和后端之间的初始连接,从前端向后端发送消息,从后端向前端回复,但不仅仅是从后端向前端发送消息.看起来很简单,但我什么也没看到。
main.py
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'tmp-secret-key'
socketio = SocketIO(app)
@app.route('/')
def sessions():
message = "test message"
print(message)
socketio.emit('message', message)
return render_template('index.html')
@socketio.on('my event')
def handle_my_custom_event(json, methods=['GET', 'POST']):
print('received my event: ' + str(json))
socketio.emit('my response', "hello")
if __name__ == '__main__':
socketio.run(app, debug=True)
index.html(在模板文件夹中)
<!DOCTYPE html>
<html lang="en">
<head>
<title>Flask SocketIO Test</title>
</head>
<body>
<script src="https://cdn.socket.io/4.4.1/socket.io.min.js" integrity="sha384-fKnu0iswBIqkjxrhQCTZ7qlLHOFEgNkRmK2vaO/LbTZSXdJfAu6ewRBdwHPhBo/H" crossorigin="anonymous"></script>
<script type="text/javascript">
var socket = io();
socket.on('connect', function() {
console.log("connection found")
socket.emit( 'my event', {
data: 'User Connected'
});
});
socket.on('message', function(data) {
console.log("message data: ", data);
});
socket.on('my response', function(msg) {
console.log("my response: ", msg)
})
</script>
</body>
</html>
requirements.txt
flask==2.0.2
flask-socketio==5.1.1
simple-websocket==0.5.0
python-engineio==4.3.1
python-socketio==5.5.1
当页面加载时,它会打印到标准输出:
- 1:测试消息
- 2:收到我的事件:{'data': 'User Connected'}
当页面加载时,它会打印到浏览器控制台:
- 1:找到连接
- 2:我的回复:你好
输出表明可以进行通信。此外,如果打开了第二个窗口,则浏览器控制台会显示message data: test message,这就是我只需要打开一个会话的情况。这似乎表明存在会话或命名空间问题,但我不确定出了什么问题。
【问题讨论】:
-
我不确定它是否对你有帮助。在模板被渲染和交付之前,不会收到消息。第一个会话不是这种情况,因此尚未建立连接。但是,如果打开第二个会话,则第一个会话已建立、连接并接收消息。
-
@Detlef 嗯,这确实有帮助。如果会话处于活动状态,当打开一个新会话时,我会在其控制台中收到我正在寻找
message data: test message的消息。我相信每次刷新或更改页面时都会重新渲染模板,所以有没有办法在模板渲染后初始化会话?您认为问题出在 js 方面、python 方面还是两者兼而有之?