首页 > 解决方案 > SQLAlchemy:我可以在作为 declarative_base 类的用户类中散列密码吗?

问题描述

我有用户类:

engine = create_engine('mysql://root:@localhost/academic', convert_unicode=True, echo=False)
Base = declarative_base()
Base.metadata.reflect(engine)

class User(Base):
    __table__ = Base.metadata.tables['user']

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')
    
    @password.setter
    def password(self, password):
        self.password = generate_password_hash(password)
    
    def verify_password(self, password):
        return check_password_hash(self.password, password)

该代码在没有密码方法的情况下可以正常工作,但是一旦我取消注释它们,页面就会继续加载并且没有来自服务器的响应。

标签: flasksqlalchemyflask-sqlalchemywerkzeug

解决方案


你在self.password里面设置@password.setter,导致无限递归。取一个私有字段_password,并使其与数据写入和读取的位置相对应:

class User(Base):
    __table__ = Base.metadata.tables['user']
    _password = Column("password", String(256), nullable=False)

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')
    
    @password.setter
    def password(self, password):
        self._password = generate_password_hash(password)
    
    def verify_password(self, password):
        return check_password_hash(self._password, password)

推荐阅读