使用ujid和bcrypt与django不生成唯一值

时间:2015-08-13 23:52:07

标签: python django uuid

构建一个uuid,然后使用bcrypt对其进行散列,每次初始化时,都会在auth_secret中生成一个具有相同值的对象(uuid4()不会为每个新实例生成唯一值)。这是终端输出

>>> from quickstart.models import FarmUserAuthentication
>>> c = FarmUserAuthentication('as')
>>> d = FarmUserAuthentication('asdfs')
>>> c
<FarmUserAuthentication:  $2a$12$euUMcvhPwPsS7SQgiOVGNeWr792cq.tKONl9bTVjY3nvrxpczPqs6>
>>> d
<FarmUserAuthentication:  $2a$12$euUMcvhPwPsS7SQgiOVGNeWr792cq.tKONl9bTVjY3nvrxpczPqs6>

这是我在models.py中的代码

class FarmUserAuthentication(models.Model):
    auth_id = models.CharField(primary_key = True, max_length = 10)
    hash = bcrypt.hashpw(str(uuid.UUID4()), bcrypt.gensalt())
    auth_secret = models.CharField(max_length=100, default= hash, editable=False)

1 个答案:

答案 0 :(得分:1)

我相信,你已经在Python中犯了一个基本错误,就像你在Django模型中看到的那样尝试构建你的类。

此:

class FarmUserAuthentication(models.Model):
    # ...
    hash = bcrypt.hashpw(str(uuid.UUID4()), bcrypt.gensalt())

is a class variable, not an instance variable。因此,该值在类的所有实例之间共享。

如果您想为每个实例提供唯一值,那么执行此操作的常规方法是__init__函数。但是,in Django you should not override __init__,所以您应该只是向模型中添加一个创建哈希的函数。也许是这样的:

class FarmUserAuthentication(models.Model):
    def get_hash():
        return bcrypt.hashpw(str(uuid.UUID4()), bcrypt.gensalt())

或者因为你不能在Django模板中轻松调用,可能是property

class FarmUserAuthentication(models.Model):
    @property
    def hash():
        return bcrypt.hashpw(str(uuid.UUID4()), bcrypt.gensalt())