Найти - Пользователи
Полная версия: Неожиданный logout из сессии во flask с flask_login
Начало » Python для новичков » Неожиданный logout из сессии во flask с flask_login
1
vbsm
Здравствуйте. Подскажите, пожалуйста, где закралась моя ошибка.

Ниже небольшой тестовый фрагмент кода (я только изучаю фреймворк). Пытаюсь реализовать систему разграничения доступа к различным страницам сайта на основании логина. Основной код:

 #!/usr/bin/env python3
from datetime import timedelta
from flask import Flask, session, render_template, redirect, url_for
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
from flask_wtf import FlaskForm
from flask_login import LoginManager, UserMixin, current_user, login_user, logout_user, login_required
app = Flask(__name__)
app.secret_key = "+4Qdz8s57TJP8eLxi5rV5+aBFh601WilSZQoWzZJEIEpu39nlWbjgA=="
app.permanent_session_lifetime = timedelta(minutes=60*24)
# Login manager init.
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
    pass
valid_creds = {
    "p1": {
        "password": "123"
        },
    "p2": {
        "password": "000"
        }
}
@login_manager.user_loader
def user_loader(login):
    if login != "user":
        return
    user = User()
    user.id = login
    return user
@login_manager.unauthorized_handler
def unauthorized_callback():
    return redirect(url_for("login"))
class LoginForm(FlaskForm):
    login = StringField(label="Имя пользователя:", validators=[DataRequired()])
    password = PasswordField(label="Пароль:", validators=[DataRequired()])
    submit = SubmitField(label="Submit") 
     
@app.route("/")
@login_required
def index():
    print(f"User: {current_user.id}, authentication: {current_user.is_authenticated}")
    return render_template("index.html")
@app.route("/login", methods=["GET", "POST"])
def login():
    # If a user already logged in, route to login must not be available.
    if current_user.is_authenticated:
        return redirect(url_for("index"))
    form = LoginForm()
    if form.is_submitted() and form.validate():
        login = form.login.data
        password = form.password.data
        if login in valid_creds:
            if password == valid_creds[login]["password"]:
                user = User()
                user.id = login
                login_user(user, remember=True)
                
                return render_template("index.html")
            else:
                form.password.errors.append("Неверный пароль")
        else:
            form.login.errors.append("Такого пользователя не существует")
    return render_template("login.html", form=form)
@app.route("/restricted")
@login_required
def restricted():
    return render_template("restricted.html")
@app.route("/logout", methods=["GET", "POST"])
@login_required
def logout():
    logout_user()
    return redirect(url_for("login"))

Ссылка на privatebin, если кому-то удобно читать с исходной разметкой - https://privatebin.net/?16ecc1355a7df073#DVJ9ZMdGVd5JQQmc7ktV9u5kd6MVcpNaQkAhrWjVNkQC

При тестеровании на этапе ввода логина и пароля, если они совпадают с теми, что указаны в словаре valid_creds, все ОК. Однако, после успешного логина, если я нажму на любую ссылку (переход к restricted.html, например), я немедленно получаю logout. Не понимаю, почему так происходит. Сессия сохраняется, срок ее действия не истек. В коде маршрутов до index или restricted нет прямых команд logout. Где зарыта пресловутая собака?
vbsm
Немного уточню вопросу, с учетом того, как я изменил функцию unauthorized_callback. Если ее не менять, то я получаю Unauthorized, если залогиненым перехожу к странице restricted. То есть как будто декоратор @login_required не срабатывает, хотя если я вывожу current_user.is_authorized при переходе на restricted, я всегда получаю True.
vbsm

Прошу прощения, увидел очевидную ошибку. Вот, что значит глаз замылился. Нужно поправить @login_manager.user_loader для использования валидных логинов.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB