将 uuid 和 bcrypt 与 django 一起使用不生成唯一值
using uuid and bcrypt with django not generating unique values
构建一个 uuid 然后用 bcrypt 对其进行哈希处理最终会在 auth_secret 中生成一个具有相同值的对象(uuid4() 不会为每个新实例生成唯一值)每次初始化时。这是终端输出
>>> from quickstart.models import FarmUserAuthentication
>>> c = FarmUserAuthentication('as')
>>> d = FarmUserAuthentication('asdfs')
>>> c
<FarmUserAuthentication: a$euUMcvhPwPsS7SQgiOVGNeWr792cq.tKONl9bTVjY3nvrxpczPqs6>
>>> d
<FarmUserAuthentication: a$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)
我相信你在 Python 中犯了一个根本错误,因为你试图按照你在 Django 模型中看到的那样构建你的 class。
这个:
class FarmUserAuthentication(models.Model):
# ...
hash = bcrypt.hashpw(str(uuid.UUID4()), bcrypt.gensalt())
is a class variable, not an instance variable。因此,该值在 class.
的所有实例之间共享
如果您希望每个实例都有一个唯一值,通常的方法是在 __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())
构建一个 uuid 然后用 bcrypt 对其进行哈希处理最终会在 auth_secret 中生成一个具有相同值的对象(uuid4() 不会为每个新实例生成唯一值)每次初始化时。这是终端输出
>>> from quickstart.models import FarmUserAuthentication
>>> c = FarmUserAuthentication('as')
>>> d = FarmUserAuthentication('asdfs')
>>> c
<FarmUserAuthentication: a$euUMcvhPwPsS7SQgiOVGNeWr792cq.tKONl9bTVjY3nvrxpczPqs6>
>>> d
<FarmUserAuthentication: a$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)
我相信你在 Python 中犯了一个根本错误,因为你试图按照你在 Django 模型中看到的那样构建你的 class。
这个:
class FarmUserAuthentication(models.Model):
# ...
hash = bcrypt.hashpw(str(uuid.UUID4()), bcrypt.gensalt())
is a class variable, not an instance variable。因此,该值在 class.
的所有实例之间共享如果您希望每个实例都有一个唯一值,通常的方法是在 __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())