Flask Python Authentication error: identity = getattr(identity, 'id') or identity['id']

Flask Python Authentication error: identity = getattr(identity, 'id') or identity['id']

我正在尝试使用 Flask 和 flask_jwt 的简单身份验证逻辑,它曾经正常工作,但突然间我开始遇到此异常: identity = getattr(identity, 'id') or identity['id']

这是我的用户模型:

class UserModel:
    def __init__(self, id, username, password):
        self._id = id
        self.username = username
        self.password = password

    @classmethod
    def find_by_username(cls, username):
        db = sqlite3.connect(path)
        cursor = db.cursor()
        query = 'SELECT * FROM users WHERE username=?'
        result = cursor.execute(query, (username,))
        row = result.fetchone()
        if row:
            user = cls(*row)
        else:
            user = None
        db.close()
        return user

    @classmethod
    def find_by_id(cls, _id):
        db = sqlite3.connect(path)
        cursor = db.cursor()
        query = 'SELECT * FROM users WHERE id=?'
        result = cursor.execute(query, (_id,))
        row = result.fetchone()
        if row:
            user = cls(*row)
        else:
            user = None
        db.close()
        return user

这是我的安全模块:

def authenticate(username, password):
    print("authenticate was called.")
    user = UserModel.find_by_username(username)
    print(user)
    if user and safe_str_cmp(user.password, password):
        return user

def identity(payload):
    user = payload['identity']
    return UserModel.find_by_id(user)

我不知道是什么导致了这个异常,我知道有更复杂的方法可以解决这个问题,但我正在构建我的应用程序,从一个简单的基本应用程序到一个更符合当前要求的应用程序练习一,这里是堆栈跟踪:

Traceback (most recent call last):
  File "C:\Users\EM\PycharmProjects\Learn\venv\lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  ...
  File "C:\Users\EM\PycharmProjects\Learn\venv\lib\site-packages\flask_jwt\__init__.py", line 125, in _default_auth_request_handler
    access_token = _jwt.jwt_encode_callback(identity)
  File "C:\Users\EM\PycharmProjects\Learn\venv\lib\site-packages\flask_jwt\__init__.py", line 62, in _default_jwt_encode_handler
    payload = _jwt.jwt_payload_callback(identity)
  File "C:\Users\EM\PycharmProjects\Learn\venv\lib\site-packages\flask_jwt\__init__.py", line 53, in _default_jwt_payload_handler
    identity = getattr(identity, 'id') or identity['id']
AttributeError: 'UserModel' object has no attribute 'id'

如文档所示,(https://pythonhosted.org/Flask-JWT/) Flask jtf 要求您的 User class 具有 id 属性,而不是 _id 属性