Python Flask调用login_user报错User无get_user_by_token属性求助
报错原因
1. 代码逻辑错误
你的login_post路由中从未定义user变量,直接在login_user(user)处调用了未声明的变量,同时硬编码的管理员校验逻辑存在两处错误:
- 明文密码
adminpwd直接传入check_password_hash方法,该方法第一个参数要求是经generate_password_hash生成的哈希值,永远校验不通过 - 管理员校验分支未关联任何User实例,就算校验通过也没有合法的user对象传入
login_user
2. 组件冲突
你同时启用了Flask-Login原生的LoginManager和Flask-User的UserManager,二者功能重叠。Flask-User要求User模型必须实现get_user_by_token方法用于令牌校验,你的User类没有实现该方法,因此抛出AttributeError。
修复步骤
第一步:修正登录逻辑
删除冗余的硬编码管理员校验逻辑,先根据用户名查询User实例再做校验:
@auth.route('/login', methods=['POST']) def login_post(): username = request.form.get('username') password = request.form.get('password') remember = True if request.form.get('remember') else False # 根据用户名查询用户实例 user = User.query.filter_by(username=username).first() # 校验用户存在且密码正确 if not user or not check_password_hash(user.password, password): flash('请检查登录信息后重试') return redirect(url_for('auth.login')) login_user(user, remember=remember) # 按角色跳转对应页面 if any(role.name == 'Admin' for role in user.roles): return redirect('/admin/dashboard') return redirect(url_for('auth.profile'))
第二步:解决组件冲突
二选一即可:
方案A:保留Flask-User,删除冗余的Flask-Login配置
删除以下代码,Flask-User会自动接管登录校验逻辑:
login_manager = LoginManager() login_manager.login_view = 'auth.login' login_manager.init_app(app) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
方案B:保留原生Flask-Login,补全User类要求的方法
如果你更习惯用原生Flask-Login的逻辑,只需要在User类中补全Flask-User要求的方法即可(不需要令牌功能直接返回None):
class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.Text, unique=True, nullable=False) password = db.Column(db.Text, nullable=False) # Relationships roles = db.relationship('Role', secondary='user_roles', backref=db.backref('users', lazy='dynamic')) # 补全Flask-User要求的静态方法 @staticmethod def get_user_by_token(token, expiration=None): return None
第三步:修正其他语法错误
把admin_dashboard路由中的转义字符"替换为正常的双引号:
@auth.route('/admin/dashboard') @roles_required('Admin') def admin_dashboard(): return render_template("admin_dashboard.html")
内容的提问来源于stack exchange,提问作者lllakkka
相关产品推荐
相关产品推荐

