自定义数字字段不执行“to_python”?

时间:2013-07-11 06:02:55

标签: django encryption python-2.7 django-models

我是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上的网站。

请有人帮我解决这个问题,是否有办法调试这类问题?,任何建议都被接受,提前谢谢......

1 个答案:

答案 0 :(得分:1)

终于得到了答案:)

必须了解SQLite数据库系统的工作原理!

这里的问题是,当我们使用的数据库时,在这种情况下让它成为任何数据库。首先,我们将格式化要存储到其中的数据。一旦将类型分配给数据库表字段,(我不知道为什么)仍然可以保存其他格式的数据(可能是SQLite中的bug,表有Integer字段但仍然存储了350个字符长的字符串,命令行显示)。检索完成时出现问题,数据库软件将从字段中查找整数值,但会获得一些不受支持的值。 (因此错误)。

现在我的问题可能转移到前面提到的段落中的括号中?这是真的吗(因为它对我来说就是这样)或者还有其他原因吗?