Колба-Сессия теряет данные сеанса входа в колбу после обновления

#python #flask #flask-login #flask-socketio #flask-session

Вопрос:

В настоящее время я создаю приложение для чата с разными комнатами, используя Flask, Flask-сеанс, Flask-SocketIO и Flask-Логин. Я сохраняю текущую комнату пользователя в сеансе, чтобы отобразить информацию, основанную на этой комнате. Я обновляю эти данные сеанса из события Flask-SocketIO, и я могу сделать это только с помощью модуля Flask-сеанса, а не встроенного сеанса из Flask. Поэтому, когда я регистрирую пользователя с помощью Flask-Login, данные текущих пользователей сохраняются в этом сеансе Flask-сеанса с типом сеанса «файловая система». Когда я затем обновляю страницу, данные для входа в систему Flask больше не находятся в сеансе, что приводит к сбою моей программы, поскольку текущий пользователь теперь является объектом AnonymousUserMixin, поэтому пользователь вышел из системы. Так что же приводит к потере данных текущего пользователя в сеансе? Есть ли проблема с совместным использованием Flask-сеанса и входа в систему Flask? Или я просто сделал что-то не так в конфигурации?

Вот как выглядит сеанс до и после обновления:

До:

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

После:

 <FileSystemSession {'_permanent': True, 'csrf_token': 'cd2428d22717128228ea31b9182ac46766802839', 'current_room': 'Lobby'}>
 

Как вы можете видеть, данные сеанса, поступающие из модуля входа в систему Flask, исчезли, поэтому в нем говорится, что пользователь не вошел в систему.

Вот мой код:

init.py:

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

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

 

auth.py:

 from flask import Blueprint, render_template, flash, url_for, redirect, session, current_app
from flask_login import login_user, logout_user, current_user, login_required
from .wtform_fields import RegistrationForm, LoginForm
from werkzeug.security import generate_password_hash, check_password_hash
from .models import *
from app import app

auth = Blueprint("auth", __name__)


@auth.route("/login", methods=["GET", "POST"])
def login():
    login_form = LoginForm()

    if login_form.validate_on_submit():
        username = login_form.username.data
        password = login_form.password.data

        user = User.query.filter_by(username=username).first()

        if user:
            if check_password_hash(user.password, password):
                login_user(user)
                flash("Logged in successfully", category="success")
                session["current_room"] = "Lobby"
                return redirect(url_for("views.chat"))
            else:
                flash("Password is incorrect", category="error")
        else:
            flash(f"No user named {username}", category="error")

    return render_template("login.html", form=login_form, user=current_user)

 

views.py:

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


views = Blueprint("views", __name__)

@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()) 
    #Crashes after refresh because current user is anonymous

 

application.py

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

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 #Where I update the session
    emit("room-manager", {"message": f"{user} has joined the {room} room"}, room=room)


 

Комментарии:

1. Возможно, срок действия сеанса истек