我正在创建表示用户凭据的 SQLAlchemy 类。
我想要字段 password
存储密码的散列值。因此,我想通过以下方式覆盖它的行为:
当分配
credentials.password = value
时,它实际上存储值的散列当比较
credentials.password == value
时,它实际上是与值的哈希值进行比较
我已阅读 SQLAlchemy 文档的以下部分 http://docs.sqlalchemy.org/en/rel_0_7/orm/mapper_config.html#using-descriptors-and-hybrids
而且我想我确实了解如何解决问题 1。
但是我不确定,如何做第二点。有没有一种安全的方法(不破坏 SQLAlchemy)?
这是示例模型:
class Credentials(Base):
__tablename__ = 'credentials'
id = Column(Integer, primary_key=True)
_password = Column('password', String)
@hybrid_property
def password(self):
return self._password
@password.setter(self):
self._password = hash(self._password)
最佳答案
为了进行比较,由于您无法取消哈希密码,因此您需要为 Column 类创建一个自定义类型,它会覆盖 eq 运算符:
class MyPasswordType(String):
class comparator_factory(String.Comparator):
def __eq__(self, other):
return self.operate(operators.eq, hash(other))
看看:http://docs.sqlalchemy.org/en/latest/core/types.html#types-operators
和http://docs.sqlalchemy.org/en/latest/core/types.html#sqlalchemy.types.TypeEngine.comparator_factory
要设置你只需要传入值:
@password.setter
def password(self, value):
self._password = hash(value)
关于python - SQLAlchemy 覆盖 ==,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12212636/