在Flask中使用socketio.on()渲染新模板

6 投票
1 回答
4763 浏览
提问于 2025-04-18 07:25

我正在尝试做一些类似这样的事情:

from flask import Flask, render_template, redirect, url_for
from flask.ext.socketio import SocketIO

app = Flask(__name__)
socketio = SocketIO(app)

@app.route('/start')
def start():
    return render_template('start.html')

@app.route('/new_view')
def new_view():
    return render_template('new_view.html')

@socketio.on('change_view')
def change_view(message):
    return redirect(url_for('new_view'))

if __name__ == "__main__":
    socketio.run(app, host='127.0.0.1', port=8080)

基本上,我想要在客户端收到 'change_view' 消息时进行重定向。目前,当我点击一个按钮触发 socket.emit('change_view', message) 调用后,它会进入 change_view() 函数,所以这一部分是正常工作的。问题是,它并没有重定向,也没有进入 new_view() 函数(也就是说,如果我在 new_view() 中放一个打印语句,它不会打印出来)。而且它也没有给我任何错误提示。我对 sockets 还很陌生,所以我猜可能存在一些基本的误解。

1 个回答

9

是的,socket.io 不是这样工作的。你可以发送一条消息,让客户端加载一个新页面。

emit('redirect', {'url': url_for('new_view')})

然后在你的客户端:

socket.on('redirect', function (data) {
    window.location = data.url;
});

不过,这个例子里不太明白你为什么需要联系服务器。

撰写回答