首页 > 解决方案 > Flask is_authenticated 用户状态在重定向到另一个端点时发生变化

问题描述

我正在尝试制作仅适用于登录用户的端点(addurl)。发生的问题是,当我在 /login 端点上登录时 current_user.is_authenticated 返回'<bound method User.is_authenticated of <User 2>>'(在 login_user(user) 之后)。但是,在重定向到 /addurl 时,current_user.is_authenticated 会以某种方式被覆盖并更改为 False。我该如何解决这个问题?

代码

模型:

from app import db, login_manager


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(1024))



    def is_active(self):
        """True, as all users are active."""
        return True

    def get_id(self):
        """Return the email to satisfy Flask-Login's requirements."""
        return self.email

    def is_authenticated(self):
        """Return True if the user is authenticated."""
        return self.authenticated

    def is_anonymous(self):
        """False, as anonymous users aren't supported."""
        return False

形式:

class LoginForm(FlaskForm):
    email = StringField('Your Username: ', validators=[DataRequired()])
    password = PasswordField('password', validators=[DataRequired()])
    submit = SubmitField('Log In')

意见:

@app.route("/login", methods=["GET", "POST"])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()

        if user and bcrypt.check_password_hash(user.password, form.password.data):

            login_user(user)

            return redirect('/addurl')
        else:
            return render_template('login.html', form=form)
    return render_template('login.html', form=form)


@app.route('/addurl', methods=['GET', 'POST'])
def addurl():
    form = CompanyForm()
    if current_user.is_authenticated:
        if form.validate_on_submit():
            foo()
            return redirect('/base')
    else:
        flash('you have to be logged in')
    return render_template('AddUrl.html', form=form)

标签: authenticationflaskflask-sqlalchemyflask-wtformsflask-login

解决方案


您似乎忘记了创建addurl“login_required”路线。尝试这样的事情:

from flask_login import login_required

# original source code...

@app.route('/addurl', methods=['GET', 'POST'])
@login_required
def addurl():
    # original source code...

@login_required装饰师应该做你需要的所有魔法。

另外,请务必LoginManager正确初始化 in app.py

from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)

推荐阅读