Flask-Login登录成功后current_user仍返回匿名用户问题求助
Flask-Login登录后current_user仍为匿名用户排查方案
- 必须实现
@login_manager.user_loader回调
- 必须实现
这是Flask-Login的强制要求,框架需要通过这个回调从Session中存储的用户ID加载对应的User实例,没有这个回调的话登录后无法还原用户对象,
current_user会始终为匿名用户。
示例代码:
@login_manager.user_loader def load_user(user_id): # 这里从sqlite3查询对应用户ID的用户,返回User类实例,查不到返回None return User(user_id)
注意你现有代码里调用的load_user(username)是错误的,user_loader接收的参数是用户ID,不是用户名,你需要先根据用户名查询到用户ID,再生成User实例。
- 修复User类的兼容性问题
你继承了UserMixin后不需要手动实现is_authenticated/is_active/is_anonymous/get_id这些方法/属性,新版Flask-Login的UserMixin已经默认实现了这些属性,你自己定义成方法反而会导致框架读取属性时得到方法对象,出现兼容性问题。修复后的User类可以简化为:
- 修复User类的兼容性问题
class User(UserMixin): def __init__(self, id): self.id = str(id)
- 修复登录路由的逻辑错误
- 你调用
search.login_user()时没有传入取到的username和password参数,无法正确校验用户凭证,大概率你的校验逻辑本身就没有正确执行 login_user的remember参数需要传入布尔值,你传入的字符串'y'不符合要求,改为remember=True即可- 你代码里打印的
user变量没有定义,属于笔误,应该是你刚生成的username_to变量
修复后的登录POST逻辑参考:
if request.method == 'POST': if current_user.is_authenticated: return redirect("/control-panel") username = request.form["username"] password = request.form["password"] # 传入账号密码校验 if search.login_user(username, password) == True: # 先根据用户名查询到用户ID,再生成User实例 user_id = search.get_user_id_by_username(username) user_obj = User(user_id) login_user(user_obj, remember=True) return redirect("/control-panel") else: return render_template("incorrect-login-credentials.html")
- 检查Flask核心配置
确保你已经配置了SECRET_KEY,没有这个配置Flask无法加密存储Session,登录状态会在跳转后丢失:
- 检查Flask核心配置
app.config['SECRET_KEY'] = '你的随机密钥字符串,生产环境不要泄露'
内容的提问来源于stack exchange,提问作者simon3
相关产品推荐
相关产品推荐

