【问题标题】:Flask Python Authentication error: identity = getattr(identity, 'id') or identity['id']Flask Python 身份验证错误:identity = getattr(identity, 'id') 或 identity['id']
【发布时间】:2020-09-27 15:45:42
【问题描述】:

我正在尝试使用 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'

【问题讨论】:

    标签: python flask jwt-auth


    【解决方案1】:

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

    【讨论】:

    • @ClsForCookies 但当我使用 id 而不是 _id 时,我收到此消息:Shadows built-in name 'id'
    • 这是一个很好的警告,flask jwt 的开发者似乎忽略了它。要么忽略警告,要么不按原样使用此模块。隐藏内置插件并不是世界末日,但它可能会导致一些非常讨厌的错误
    • @ClsForCookies 非常感谢您花时间回答这个问题。
    • Np。因为你,我实际上学到了一些新东西。谢谢
    猜你喜欢
    • 2019-08-17
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2019-04-18
    • 2017-09-11
    相关资源
    最近更新 更多