Flask-Login 在使用 remember_me 时使用注销后仍然登录

Posted

技术标签:

【中文标题】Flask-Login 在使用 remember_me 时使用注销后仍然登录【英文标题】:Flask-Login still logged in after use logouts when using remember_me 【发布时间】:2014-09-28 10:14:37 【问题描述】:

要使用 Flask-login 在烧瓶中注销用户,我只需调用 logout_user(),但是在添加了一些额外的会话检查后,在我单击注销并再次单击返回“登录页面”后,我仍然登录. 只有当我选择“记住我”时才会发生这种情况

我想我在这里误解了 session 和 logout_user() 的概念,有人可以澄清和帮助吗?

在我看来,我认为当我清除会话时,包括“user_id”、“用户名”等在内的所有内容也将被清除。但不知何故,“user_id”或“用户名”字段仍然存在。我认为这就是导致问题的原因。

我的代码如下:

登出部分:

@mod.route('/logout/')
@login_required
def logout():
  logout_user()
  session.clear()
  return redirect(url_for('users.login'))

登录部分:

@mod.route('/login/', methods=['GET', 'POST'])
def login():

  if g.user is not None and g.user.is_authenticated():
    return redirect(url_for('users.home'))

  form = LoginForm(request.form)

  if form.validate_on_submit():
    user = User.query.filter_by(email=form.email.data).first()
    if user and check_password_hash(user.password, form.password.data):
      session['user_id'] = user.id
      session['username'] = user.nickname
      session['remember_me'] = form.remember_me.data

      remember_me = False
      if 'remember_me' in session:
          remember_me = session['remember_me']
          session.pop('remember_me', None)

      login_user(user, remember_me)

      return redirect(url_for('users.home'))
  return render_template("users/login.html", form=form)

【问题讨论】:

【参考方案1】:

当您使用Flask-Login 时,您不应该自己更新会话字典。您只需要为login_user 方法提供remember_me 标志,仅此而已。所以我建议更新你的代码如下:

@mod.route('/login/', methods=['GET', 'POST'])
def login():

    if g.user is not None and g.user.is_authenticated():
        return redirect(url_for('users.home'))

    form = LoginForm(request.form)

    if form.validate_on_submit():

        user = User.query.filter_by(email=form.email.data).first()
        if user and check_password_hash(user.password, form.password.data):
            # Just set this flag. Either True or False. 
            remember_me = False
            login_user(user, remember_me)
        return redirect(url_for('users.home'))

    return render_template("users/login.html", form=form)

上面的代码应该可以做所有事情。

【讨论】:

呃,这里的注销部分在哪里??

以上是关于Flask-Login 在使用 remember_me 时使用注销后仍然登录的主要内容,如果未能解决你的问题,请参考以下文章

Flask-Login

flask-login的使用3

Flask-Login用户登陆

flask-login的简单实用

烧瓶登录:Chrome 忽略 cookie 过期?

Flask-Login + Flask-Sockets = Chaos