要使用Flask-login注销烧瓶中的用户,我只需调用logout_user(),但在使用session添加一些额外的检查后,在我单击logout并再次单击“登录页面”后,我仍然登录只有当我选择“记住我”时才会发生这种情况
我想我在这里误解了session和logout_user()的概念,有人可以澄清并帮助吗?
在我看来,我认为当我清除会话时,包括'user_id','username'等在内的所有内容也将被清除。但不知何故,'user_id'或'username'字段仍然存在。我认为这就是导致问题的原因。
我的代码如下:
退出部分:
@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)
答案 0 :(得分: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)
上面的代码应该可以做任何事情。