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

时间:2019-07-12 12:31:25

标签: python mongoengine flask-mongoengine

我不确定让用户文档在创建时自动哈希其密码的最佳/ 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()

我是否只有在创建或更改密码时才对密码进行哈希处理?

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

1 个答案:

答案 0 :(得分:1)

我没有给您代码示例,您可以使用Document.update()方法来更新仅更改的字段。

如果您仍然想使用save方法, 然后,您可以按照以下几行创建逻辑。

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

或者,Mongoengine中的update接受可迭代的,因此您可以简单地创建列表或字典对象,并方便地选择从中删除密码哈希字段。

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

使用Dict之类的可迭代链接进行更新。 stackoverflow question for Mongoengine update using iterable

讨论过时不赞成使用保存方法的链接(维护者在下面评论说不赞成不使用保存方法,因此请信任他/她并随意进行此链接) Mongoengine save method deprecated?

mongoengine中更新方法的链接。 Mongoengine Atomic Update