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

Python MongoEngine-仅在创建文档或设置特定字段时调用函数?,python,mongoengine,flask-mongoengine,Python,Mongoengine,Flask Mongoengine,我不确定让用户文档在创建时自动散列其密码的最佳方式是什么 考虑以下mongoengine模型: class User(Document): email = EmailField(required=True, primary_key=True) name = StringField(required=True) pswd = StringField(required=True) def check_pswd(self, password): ret

我不确定让用户文档在创建时自动散列其密码的最佳方式是什么

考虑以下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()方法来更新仅已更改的字段

如果你还想使用save方法, 然后,您可以沿着以下几行创建一个逻辑

  • 检查用户是否更改了密码(通过比较现有存储的哈希值和新哈希值(如果有))
  • 如果新哈希值不同,则用户已更改密码。在这种情况下,您可以推送Document.update方法
  • 如果没有,不要调用该字段的更新
  • 或者,Mongoengine中的update接受iterable,因此您可以简单地创建一个列表或字典对象,并方便地选择从中删除密码散列字段

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

    使用类似Dict的iterable进行更新的链接。

    讨论save方法弃用的链接(维护人员在下面评论save方法未弃用,因此请信任他/她并在该链接上随意继续)

    mongoengine中更新方法的链接。

    我不知道save被弃用了,文档中的教程都在使用save。我坚持使用官方的mongodb python驱动程序来避免这样的意外。没关系,我知道怎么做。这里的Mongoengine维护人员“save”一点也不弃用!!我只是修改了上面的帖子以避免混淆,我建议你在我上面提到的链接上给我一个惊喜,以澄清问题