我是 Django 和 Python 的新手。
在我的项目中,我使用的是我定义的 CustomField,以便我可以在存储到数据库之前加密数据值并在检索后解密(在我的情况下需要加密)。
我已经通过 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 上开发站点。
请有人帮我解决这个问题,还有没有办法调试这些问题?,任何建议都被接受,提前谢谢你......