【发布时间】:2019-07-07 15:30:41
【问题描述】:
所以我使用 python secrets 库来生成令牌,所以我想像这样将其添加为默认值
token=models.CharField(max_length=32, default=secrets.token_urlsafe(32))
奇怪的是它会生成 43 个字符而不是 32 个字符,所以谁能帮我理解为什么?
谢谢
【问题讨论】:
标签: python django django-models
所以我使用 python secrets 库来生成令牌,所以我想像这样将其添加为默认值
token=models.CharField(max_length=32, default=secrets.token_urlsafe(32))
奇怪的是它会生成 43 个字符而不是 32 个字符,所以谁能帮我理解为什么?
谢谢
【问题讨论】:
标签: python django django-models
default 参数必须指向一个可调用,而不是带参数的函数调用(仅在 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 的参数是字节的数量,而不是字符。根据documentation,这意味着每个字节大约有 1.3 个字符,因此 32 * 1.3 = ~42。
【讨论】:
save()方法?如果您真的只想要 32 个字符,那么您可以对字符串进行切片。我会更新答案。
default 设置为 callable,您可以确保每次初始化新实例时它都会运行。