Форум сайта python.su
Здравствуйте. Подскажите, пожалуйста, где закралась моя ошибка.
Ниже небольшой тестовый фрагмент кода (я только изучаю фреймворк). Пытаюсь реализовать систему разграничения доступа к различным страницам сайта на основании логина. Основной код:
#!/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"))
Офлайн
Немного уточню вопросу, с учетом того, как я изменил функцию unauthorized_callback. Если ее не менять, то я получаю Unauthorized, если залогиненым перехожу к странице restricted. То есть как будто декоратор @login_required не срабатывает, хотя если я вывожу current_user.is_authorized при переходе на restricted, я всегда получаю True.
Офлайн
Прошу прощения, увидел очевидную ошибку. Вот, что значит глаз замылился. Нужно поправить @login_manager.user_loader для использования валидных логинов.
Офлайн