use*_*084 0 python sqlalchemy pyramid
作为python的新手,我不太清楚为什么我会得到不一致的结果.我注册了一个用户,我的表中的密码最终成为哈希版本.当用户更新其密码时,表中的密码最终为未散列的版本.显然,我想要哈希版本.我究竟做错了什么?(如果重要的话,我正在使用SQLAlchemy和mysql.)
我有以下内容:
def hash_password(password):
blah, blah, blah # hash my password here
return hashed_password
class User(Base):
__tablename__ = 'mytable'
email = Column('email')
_password = Column('password')
def _get_password(self):
return self._password
def _set_password(self, password):
self._password = hash_password(password)
password = property(_get_password, _set_password)
password = synonym('_password', descriptor=password)
def __init__(self, password="", email=""):
self.email = email
self.password = password
@classmethod
def register(cls, email, password):
return DBSession.add(User(email=email,password=password)) # this correctly hashes the password
@classmethod
def update(cls, email, password):
return DBSession.query(cls).filter(cls.email == email).update({'password': password}) #password ends up being the unhashed password
Run Code Online (Sandbox Code Playgroud)
这里的问题是您通过User.update
方法更新密码的方式.此方法完全跳过ORM并直接在数据库中更新行.很明显,当你这样做时,哈希密码的代码将不会运行.User
您粘贴的模型很好,与我使用的相似.你需要使用它.这意味着要更新密码,您应该加载用户并设置其密码.
user = DBSession.query(User).filter_by(email=email).first()
if user:
user.password = new_password
Run Code Online (Sandbox Code Playgroud)
然后,当事务被提交时,事情将是您期望的方式.