Flask 会话在刷新时丢失登录会话数据

问题描述

我目前正在使用 Flask 和 Flask Socketio 构建聊天应用程序。为了保存客户端当前的聊天室,我使用了会话类型为“文件系统”的 flask_session 模块。我还使用 Flask-Login 模块,因此客户端使用帐户登录。因此,当我登录客户端时,会话包含来自 Flask-Login 模块的客户端登录数据。但是一旦我刷新了聊天页面,Flask_login 数据就消失了,来自 Flask-Login 模块的当前用户变量变成了一个 AnonymousMixin 对象,这会导致我的程序崩溃。那么是什么原因导致FileSystemSession在刷新页面后丢失current_user数据?

这是我在页面刷新前后打印会话和current_user时的输出

之前:

<FileSystemSession {'_permanent': True,'csrf_token': 'f687c55dbf48c0b9cd1e4601729ba687f74e255b','current_room': 'Lobby','_fresh': True,'_user_id': '1','_id': '4825ca5a26d88cfc91bcb75ef854505f0d4cdc736affaac2fd3211fb6015b34490c6ec47ec7175dee531442ec8d3a1d5f092c4de1349ca0d48fe723aed678c5a','_flashes': [('success','Logged in successfully')]}>
<User 1>

之后:

<FileSystemSession {'_permanent': True,'current_room': 'Lobby'}>
<flask_login.mixins.AnonymousUserMixin object at 0x000002CD3CFB6910>

这是我的代码

__init__.py

from flask import Flask
from flask_session import Session
from flask_login import LoginManager
from .models import *
from os import path

app = Flask(__name__)

def create_app():
    app.config["SECRET_KEY"] = "secret!"
    app.config["SESSION_TYPE"] = "filesystem"
    app.config["sqlALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_NAME}"

    login_manager = LoginManager()
    login_manager.init_app(app)

    Session(app)

    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))

    db.init_app(app)

    from .application import socketio

    from .views import views
    from .auth import auth

    app.register_blueprint(views,url_prefix="/")
    app.register_blueprint(auth,url_prefix="/")


    return socketio,app

views.py

from flask import Blueprint,render_template,flash,redirect,url_for,request,session
from flask_login import current_user,login_required

views = Blueprint("views",__name__)

@views.route("/",methods=["GET","POST"])
def index():
    return render_template("index.html",user=current_user)

@views.route("/chat","POST"])
def chat():
    return render_template("chat.html",user=current_user,rooms=current_user.rooms,current_room=Room.query.filter_by(room_name=session["current_room"]).first())

我不知道这是否重要,但我也加入了 flask_socketio 部分,它会在房间改变时改变会话:

from flask import session
from flask_socketio import SocketIO,emit,send,join_room,leave_room
from app import app

socketio = SocketIO(app,manage_session=False)

@socketio.on('join')
def on_join(data):
    user = data["username"]
    room = data["room"]
    join_room(room)
    session["current_room"] = room
    emit("room-manager",{"message": f"{user} has joined the {room} room"},room=room)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)