Flask-JWT-Auth中User对象无encode_auth_token属性问题求助
AttributeError: 'User' object has no attribute 'encode_auth_token'问题 刚接触Python遇到这种问题很正常,别着急,咱们一步步排查:
这个错误的核心是你创建的User实例找不到encode_auth_token方法,大概率是以下几个常见原因导致的:
1. 先确认模块导入的正确性
你的测试代码里写了from project.server.models import User,先仔细核对:这个导入路径对应的models.py是不是你定义了encode_auth_token方法的那个文件?
有时候项目里如果有重名的User类,或者导入路径写错(比如多了/少了层级),就会导致你用了一个没有这个方法的User类。
2. 检查代码是否保存+环境是否刷新
如果你修改完models.py后没保存,或者运行测试的终端/解释器没重启,内存里可能还是旧的User类定义。
- 先确保
models.py的所有修改都保存了 - 关闭当前运行测试的进程,重新执行测试命令试试
3. 再核对方法的缩进是否正确
看你贴的models.py代码,encode_auth_token的缩进看起来是和__init__同级的,但再仔细确认下:这个方法必须完全缩进在class User(db.Model):的代码块内部。如果缩进错了(比如少了一层),它就变成了模块级别的函数,而不是User类的实例方法,自然调用不了。
额外的小优化建议
另外,你的encode_auth_token方法现在需要传user_id参数,但作为User的实例方法,其实可以直接用self.id,这样调用更简洁:
# 修改models.py里的方法 def encode_auth_token(self): try: payload = { 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=0, seconds=5), 'iat': datetime.datetime.utcnow(), 'sub': self.id } return jwt.encode( payload, app.config.get('SECRET_KEY'), algorithm='HS256' ) except Exception as e: return e # 测试代码里调用时改成 auth_token = user.encode_auth_token()
这样更符合面向对象的写法,也避免了传参的冗余。
如果还是没解决,可以在测试代码里加一行print(dir(User)),运行后看看输出里有没有encode_auth_token——如果没有,说明User类确实没这个方法,再回头仔细检查models.py的定义。
内容的提问来源于stack exchange,提问作者Noel

