繁体   English   中英

current_user.is_authenticated 不能在 flask_login 上工作

[英]current_user.is_authenticated not working on flask_login

我正在使用 flask_login 进行身份验证,而我的登录名中的某些内容不起作用。 事实上 current_user 属性总是假的(或anonymousUserMixin ...)我试图改变一些东西,但它没有工作。 我认为 login_user(user) 部分有问题

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

这是我的登录路由:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect('profile', username=current_user.user_id)
    form = LoginForm()
    if form.validate_on_submit():
        email = form.email.data
        user = User.query.filter_by(email=email).first()
        pass_hashed = form.password.data
        if user:
            flash("user.password, pass_hashed" + user.password + "  " + pass_hashed, category="error")
            if pass_hashed == user.password:
                usr = UserData.query.filter_by(email=email).first()
                login_user(user, remember=form.remember.data)
                session['username'] = usr.username
                next = request.args.get('next')
                # if not is_safe_url(next):
                #   return abort(400)
                # return redirect(next or url_for('index'))
                username = usr.username
                return redirect(url_for('profile', username=username))
            flash("wrong password", category="error")
            return redirect(url_for('login'))
        flash("invalid email", category="error")
        return redirect(url_for('login'))
    return render_template('login.html', form=form)

这个是我的用户 model:

class User(db.Model, UserMixin):
    __tablename__ = 'user'
    user_id = db.Column(db.Integer(), autoincrement=True)
    email = db.Column(db.String(120), primary_key=True, unique=True, nullable=False)
    password = db.Column(db.String(200), nullable=False)

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.user_id)

    def get(self, id):
        return unicode(self.user_id)

    def __repr__(self):
        return '<Email %r>' % self.email

    def check_password(self, password):
        if self.password == password:
            return True
        else:
            return False

任何帮助表示赞赏。

非常感谢

我有几个建议:尝试改变

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

至:

@login_manager.user_loader
def load_user(user_id):
    return User.query.filter(User.id == user_id).first()

尽管文档使用.get() ,但我在某些地方读到 SQLAlchemy 可能由于 Unicode 的事情而存在一些问题。 进行此更改可能足以使其正常工作。

另一个建议是,如果您实际上并未更改UserMixin方法,则不要覆盖它们。 (谈论您实际上不需要实现的 is_* 方法)

还有一点需要注意的是:

如果您检查get_id()方法的UserMixin实现,它使用text_type来转换 id。 也许也可以尝试使用它而不是内置的unicode

如果没有任何效果,最后的解决方案是将您的User id 字段从user_id (这有点多余,IMO)更改为id ,因为如果这是 model 标识符,FlaskLogin 知道如何按原样处理它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM