生成令牌作为默认值django

时间:2019-02-13 17:37:02

标签: python django django-models

所以我正在使用python secrets库,以便生成令牌,因此我想像这样将其添加为默认值

SELECT t.* FROM table t WHERE EXISTS (SELECT 1 FROM table t1 WHERE t1.supplierid = t.supplierid AND t1.materialid <> t.materialid);

奇怪的是它将生成43个字符而不是32个字符,所以有人可以帮助我理解为什么吗?

谢谢

1 个答案:

答案 0 :(得分:1)

default参数必须指向 callable ,而不是带有参数的函数调用(仅在Django启动时才被评估一次)。您需要编写自己的包装函数,然后引用它。例如:

def my_secret():
    return secrets.token_urlsafe(32)[:32] # Return only the first 32 characters.
#...
token=models.CharField(max_length=32, default=my_secret)

请参阅此答案:https://stackoverflow.com/a/12654998/4082726


关于长度:token_urlsafe的参数是字节的数量,而不是字符。根据{{​​3}},这意味着每个字节大约1.3个字符,因此32 * 1.3 =〜42。