我是Django和Python的新手。
在我的项目中,我使用的是我定义的CustomField,这样我就可以在存储到数据库之前对数据值进行加密,并在retreiving之后对其进行解密(在我的情况下需要加密)。
我已经通过git-repository / stackoverflow / google查找我的问题的答案,stackoverflow上有类似的问题,但没有一个得到这个问题。由于我无法在2天内修复它,现在肯定需要帮助。
我有以下定义CustomField的代码 -
def get_multiple_of_8(some_value):
some_value = str(some_value)
while(len(some_value) % 8 != 0):
some_value = '0'+some_value
return some_value
def is_multiple_of_8(input_str):
input_str = str(input_str)
if(len(input_str) % 8 == 0):
return True
return False
class CustomField(models.Field):
'''To Encrypt the values in Model'''
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
self.key = myProject.settings.SECRET_KEY[:8]
self.des = DES.new(self.key, DES.MODE_ECB)
kwargs['max_length'] = kwargs.get('max_length',128)
models.Field.__init__(self, *args, **kwargs)
def get_internal_type(self):
return 'CharField'
def get_prep_value(self, value):
if value is None:
return None
value = "%.2f" % value
value = get_multiple_of_8(value)
to_return = self.des.encrypt(value)
to_return = to_return.decode('latin-1')
# to_return = force_unicode(to_return)
return to_return
def to_python(self, value):
value = value.encode('latin-1')
if is_multiple_of_8(value):
to_return = self.des.decrypt(value)
try:
to_return = float(to_return)
return to_return
except:
return 0
加密工作正常,我可以使用sqlite3命令行查看加密字段值。
我得到的错误是:异常类型:InvalidOperation 异常值:十进制的文字无效:'\ xc3 \ x85 \ xc3 \ x84 \ xc3 \ xa13 \ xc2 \ xa6 \ x0f(u'
在调试时发现“to_python()”无法正常运行。 (来自django-fields git的代码源代码)。我收到错误,在通过views.py!
检索时,屏幕上显示加密字符串而不是实际值我发现stackoverflow上有一个问题有相同的问题但由于不同Python版本中的元类语法而得到修复。 我的Python版本2.7.5和Django 1.4.5,我正在开发Windows 7上的网站。
请有人帮我解决这个问题,是否有办法调试这类问题?,任何建议都被接受,提前谢谢......
答案 0 :(得分:1)
终于得到了答案:)
必须了解SQLite数据库系统的工作原理!
这里的问题是,当我们使用的数据库时,在这种情况下让它成为任何数据库。首先,我们将格式化要存储到其中的数据。一旦将类型分配给数据库表字段,(我不知道为什么)仍然可以保存其他格式的数据(可能是SQLite中的bug,表有Integer字段但仍然存储了350个字符长的字符串,命令行显示)。检索完成时出现问题,数据库软件将从字段中查找整数值,但会获得一些不受支持的值。 (因此错误)。
现在我的问题可能转移到前面提到的段落中的括号中?这是真的吗(因为它对我来说就是这样)或者还有其他原因吗?