Flask-Login все еще вошел в систему после выхода из системы при использовании Remember_me

Чтобы выйти из системы пользователя во фляге с помощью Flask-login, я просто вызываю logout_user(), но после добавления некоторых дополнительных проверок с помощью сеанса, после того, как я нажимаю выход и снова возвращаюсь на «страницу входа», я все еще вошел в систему. Это происходит только когда я выбираю "вспомнить меня"

Я думаю, что неправильно понимаю концепцию сеанса и logout_user() здесь, может ли кто-нибудь прояснить и помочь?

На мой взгляд, я думаю, что когда я очищаю сеанс, все внутри, включая «user_id», «username» и т. д., также будет очищено. Но каким-то образом поле «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)

person Kiddo    schedule 05.08.2014    source источник


Ответы (1)


Когда вы используете Flask-Login, вам не следует самостоятельно обновлять словарь сеанса. Вам просто нужно указать флаг Remember_me для метода login_user и все. Поэтому я бы предложил обновить ваш код следующим образом:

@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)

Приведенный выше код должен делать все.

person codegeek    schedule 05.08.2014
comment
эээ, а где тут выход из системы?? - person qre0ct; 27.10.2016