You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:15:03