Ниже небольшой тестовый фрагмент кода (я только изучаю фреймворк). Пытаюсь реализовать систему разграничения доступа к различным страницам сайта на основании логина. Основной код:
#!/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. Где зарыта пресловутая собака?