python - Flask Session 在刷新时丢失登录会话数据
问题描述
我目前正在使用 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, 'csrf_token': 'f687c55dbf48c0b9cd1e4601729ba687f74e255b', '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
视图.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", methods=["GET", "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)
解决方案
推荐阅读
- chat - 是否可以创建一个 Whatsapp 机器人来接受客户的订单?
- r - Number observations by group according to date of observation
- c - 为什么在这种情况下不重定向标准输出?
- python-3.x - 根据另一个列表对一个列表进行排序
- dataframe - 从大数据集中删除模糊重复
- mysql - 如何将此语句从 mySQL 更改为 PostgreSQL
- ios - 如何在缩放 pdf PDFKIT 时减少内存峰值?
- python - 我试图让计算机在我的游戏列表中生成一个数字,但它总是出现故障
- javascript - 窗口 postMessage 等待 eventListener 就绪
- powerbi - 发布 power bi 报告时度量显示为空白