This question already has answers here:
How can I convert a python urandom to a string?
(3个答案)
去年关门了。
我试图将urandom值存储到我的Django项目的mySQL数据库中。出于加密目的,该值必须完全随机。
我试了好几个小时,真的很沮丧。我在谷歌上搜索了一些答案,但解决办法行不通。
如果我按照这里的建议尝试这个Store os.urandom variable to Sqlite database in Django
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'")

我也在比纳西图书馆试过
os.urandom() decoding Issue
这样地
def createkey():
    return binascii.hexlify(urandom(16)).decode()

通过上面的内容,我得到了一条错误消息:
string argument without an encoding

我使用的是Python 3.6、Django 1.11.5和MySQL数据库。
有没有办法把天王星的价值存储到Django模型中?我想把它储存在一个沙菲尔德,但我也很高兴,如果它与其他领域的工作。

最佳答案

我会尝试这样做:

_key = models.BinaryField(blank=True)

放下max_length=16,因为这与urandom(16)不匹配。。。urandom参数对应于最大字节数。
然后,在对Model调用的createkey方法中……您希望将值保存到数据库,而不仅仅是返回值。只有在对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。

关于python - Django模型中的urandom/mySQL数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52030155/

10-14 00:18