是否可以将值传递给自定义模型字段的init?
示例代码:
class Example(models.Model):
user = models.ForeignKey(User)
text = EncryptedCharField('Text',max_length=255)
class BaseEncryptedField(models.Field):
def __init__(self, *args, **kwargs):
self.cipher = AES.new(key)
models.Field.__init__(self, *args, **kwargs)
def to_python(self, value):
if isinstance(value, EncryptedString):
return self.cipher.decrypt(binascii.a2b_base64(str(value))).split(EOD)[0]
return value
def get_db_prep_value(self, value):
if value is not None and not isinstance(value, EncryptedString):
saltlength = self.cipher.block_size - (len(value) + len(EOD)) % self.cipher.block_size
if saltlength:
value = ''.join([value,EOD,generate_salt(saltlength)])
value = EncryptedString(binascii.b2a_base64(self.cipher.encrypt(value)))
return value
在init函数中,我想传递一个密钥(存储在用户配置文件中并根据用户而改变)来设置AES密码,但我似乎无法弄清楚如何把它拿进来。
答案 0 :(得分:1)
我不确定我是否理解你的问题...但是这里有。
如果将参数传递给模型的构造函数( init ),它将在“args”集合中可用。您还可以将参数作为映射传递(因此您可以通过名称通过kwargs访问它们)。
所以你应该做像args [0]这样的事情来获取你的密钥。 (不能确切地记住第一个传递的参数是否在索引0或1处,你总是可以尝试它/ debug =))
答案 1 :(得分:0)
试试这个。在类示例中:
text = EncryptedCharField('Text', max_length=255, key=pass_the_user's_key_here)
然后在BaseEncryptedField。 init :
self.cipher = AES.new(kwargs['key'])