我不确定让用户文档在创建时自动哈希其密码的最佳/ Python方法是什么。
请考虑以下mongoengine模型:
class User(Document):
email = EmailField(required=True, primary_key=True)
name = StringField(required=True)
pswd = StringField(required=True)
def check_pswd(self, password):
return verify_password(password, self.pswd)
def hash_pswd(self, password):
return hash_password(password):
def save(self, *args, **kwargs):
self.pswd = self.hash_pswd(self.pswd)
super().save(*args, **kwargs)
创建用户时,它可以正常工作:
user = User()
user.email = 'user@email.com'
user.pswd = 'password'
user.name = 'User'
user.save()
如果我更新它,它会对其密码加倍加密,我不想要。
#User wants to change his name
user = User.objects(email='user@email.com')
user.name = 'User 2'
user.save()
我是否只有在创建或更改密码时才对密码进行哈希处理?
或者也许我应该将哈希密码的责任委托给视图/控制器?
答案 0 :(得分:1)
我没有给您代码示例,您可以使用Document.update()方法来更新仅更改的字段。
如果您仍然想使用save方法, 然后,您可以按照以下几行创建逻辑。
或者,Mongoengine中的update接受可迭代的,因此您可以简单地创建列表或字典对象,并方便地选择从中删除密码哈希字段。
关于谁应该执行此操作,即视图/控制器,这是一个设计决定,但是我宁愿将表示(GUI /前端)与逻辑分开,所以我将其委托给控制器,或者更本质地委托给谁负责处理所有与数据库/网络相关的任务,这样可以将其隔离并且易于修改。并且不会使View对象的进程/线程复杂化或变慢
使用Dict之类的可迭代链接进行更新。 stackoverflow question for Mongoengine update using iterable
讨论过时不赞成使用保存方法的链接(维护者在下面评论说不赞成不使用保存方法,因此请信任他/她并随意进行此链接) Mongoengine save method deprecated?
mongoengine中更新方法的链接。 Mongoengine Atomic Update