urandom

p8h8hvxi  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(213)

这个问题在这里已经有答案了

如何将python对象转换为字符串(4个答案)
两年前关门了。
我正在尝试将一个urandom值存储到我的django项目的mysql数据库中。出于加密目的,该值必须是完全随机的。
我努力了好几个小时,我真的很沮丧。我在谷歌上搜索了一些答案,但解决方案不起作用。
如果我像这里建议的那样尝试将os.urandom变量存储到django中的sqlite数据库中

def createkey():
    random_bytes = urandom(16)
    return b64encode(random_bytes)

key = models.BinaryField(max_length=16, default=createkey)

... 我收到这个错误信息

django.db.utils.OperationalError: (1067, "Invalid default value for 'key'")

我还用binascii库os.urandom()尝试了如下解码问题

def createkey():
    return binascii.hexlify(urandom(16)).decode()

通过以上步骤,我得到以下错误消息:

string argument without an encoding

我使用的是python3.6、django1.11.5和mysql数据库。
有没有办法把铀的价值存储到django模型中?我想把它存储在一个charfield,但我也很高兴如果它与其他领域的工作。

nkcskrwz

nkcskrwz1#

我会尝试这样做:

_key = models.BinaryField(blank=True)

放下枪 max_length=16 因为这和 urandom(16) ... urandom参数对应于最大字节数。
然后,在 Model …您希望将值保存到数据库,而不是简单地返回值。只有在 Modal 示例。。。。例如。, Modal.createkey() .
所以,你会想要更像:

def createkey():
    self._key = binascii.hexlify(urandom(16)).decode()

打电话给你的朋友 createkey() 方法。
这会解决你的问题 invalid default value for key 错误。
在没有实际复制你所拥有的东西的情况下,我有一点怀疑,你甚至可以做到以下几点:

def createkey():
    random_bytes = urandom(16)
    return b64encode(random_bytes)

key = models.BinaryField(blank=True, default=self.createkey)

你甚至可以逃脱 CharField :

key = models.CharField(max_length = x)

哪里 x 上面是块大小2来保存十六进制数据,或者4(块大小/3)来保存base64数据。对于您的具体示例,块大小是16。

相关问题