MongoEngine - 仅在创建文档或设置特定字段时调用函数?



我不确定拥有在创建时自动散列其密码的用户文档的最佳/pythonic方法是什么。

考虑以下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()

Buf 如果我更新它,它会加倍哈希其密码,我不想要那个。

#User wants to change his name
user = User.objects(email='user@email.com')
user.name = 'User 2'
user.save()

有没有办法让我仅在创建或更改密码时对其密码进行哈希处理?

或者,也许我应该将散列密码的责任委托给视图/控制器?

我不给你代码示例,你可以使用 Document.update() 方法,它将更新只更改的字段。

如果仍要使用保存方法, 然后,您可以按照以下行创建逻辑。

  1. 检查用户是否更改了密码(通过比较现有存储的哈希和新哈希(如果有))
  2. 如果新哈希不同,则用户已更改密码,在这种情况下,您可以推送 Document.update 方法。
  3. 如果没有,请不要在该字段上调用更新。

或者,Mongoengine 中的更新接受可迭代对象,因此您只需创建一个列表或字典对象,并令人信服地选择从中删除密码哈希字段。

至于谁应该执行这个,即视图/控制器,这是一个设计决策,但我宁愿将表示(GUI/前端)与逻辑分开,所以我会把它委托给控制器,甚至更内在地委托给负责处理所有数据库/网络相关任务的对象,这样它将被隔离并且易于修改。并且不会使视图对象进程/线程复杂化或减慢

使用可迭代的(如字典)进行更新的链接。 使用可迭代的Mongoengine更新的堆栈溢出问题

讨论保存方法弃用的链接(维护者在下面评论说保存方法没有被弃用,所以相信他/她并在此链接上随意继续) 不推荐使用Mongo引擎保存方法?

mongoengine中的更新方法链接。 蒙戈引擎原子更新

最新更新