如何从 Flask 函数内部访问 Flask-websocket 会话

问题描述 投票:0回答:1

正如标题所述,我在从 Flask 函数访问 Flask-websocket 会话时遇到问题。我意识到它们是不同的,并且可能以不同的方式存储,并尝试使用 Flask-session 库解决这个问题,但没有成功。

我制作了一些样板代码来说明我的问题。

from flask import Flask, session,render_template,url_for,redirect
from flask_socketio import SocketIO,join_room
app = Flask(__name__)
boards = {}
socketio = SocketIO(app)
app.secret_key = "temporary"
@app.route('/')
def index():
    return render_template('wait.html')
@app.route('/dir')
def foo():
    if "name" in session:#fails here as session is <SecureCookieSession {}> instead of {'name' : 'craig}
        pass #just a filler
    else:
        return redirect(url_for("index"))#this line will cause to repetitively go back and forward from index to foo
@socketio.on('log')
def connection(request):
    if "name" not in session:
        join_room('waiting')#in my actual code the user waits for another person
        session['name'] = 'craig'
        socketio.emit('redirect', url_for('foo'),room= 'waiting')
    else:
        pass

if __name__ == '__main__':  
   socketio.run(app ,port=5000, debug=True)

和 html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        Waiting...
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
        <script>
        const socket = io();
        socket.emit("log", { data: "connection" });
        socket.on('redirect', (dest) => {
            window.location = dest;
        });
        </script>
    </body>
</html>
python flask websocket flask-socketio flask-session
1个回答
0
投票

事实证明,flask-session 确实有解决方案,我只是用错了,在我最初尝试时忘记了这两行代码:

Session(app)
socketio = SocketIO(app, manage_session=False)# I did not have the manage_session

我也用过

session.modified = True

虽然我不确定这是否绝对必要

这是更新后的服务器代码:

from flask import Flask, session, render_template, url_for, redirect
from flask_socketio import SocketIO, join_room
from flask_session import Session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'temporary'
app.config['SESSION_TYPE'] = 'filesystem'
Session(app)
socketio = SocketIO(app, manage_session=False)

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

@app.route('/dir')
def foo():
    if "name" in session:
        name = session['name']
        return f"Hello, {name}!"
    else:
        return redirect(url_for("index"))

@socketio.on('log')
def connection(request):
    print(session)
    if "name" not in session:
        join_room('waiting')
        session['name'] = 'craig'
        session.modified = True
        socketio.emit('redirect', url_for('foo'), room='waiting')
    else:
        session.clear()

if __name__ == '__main__':  
   socketio.run(app, port=5200, debug=True)
© www.soinside.com 2019 - 2024. All rights reserved.