【问题标题】:generate token as default value django生成令牌作为默认值 django
【发布时间】: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


    【解决方案1】:

    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。

    【讨论】:

    • 是的,但它会返回相同的结果,我现在正在试验,基本上它以某种方式产生了比它应该更多的东西
    • 哦,我明白了。根据文档,它每字节生成约 1.3 个字符。该参数不是字符数,而是字节数。所以 32 * 1.3 = ~42。见这里:docs.python.org/3/library/secrets.html#secrets.token_urlsafe
    • 什么save()方法?如果您真的只想要 32 个字符,那么您可以对字符串进行切片。我会更新答案。
    • @malberts 注意:参数实际上并没有被忽略(你的那部分答案是错误的)。调用该函数的问题在于,它仅在 Django 启动并加载到内存时调用一次,因此每个用户都会收到相同的令牌,直到您重新启动应用服务器。通过将 default 设置为 callable,您可以确保每次初始化新实例时它都会运行。
    猜你喜欢
    • 2011-06-20
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多