0

我是 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 上开发站点。

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

4

1 回答 1

1

终于得到答案了:)

必须了解 SQLite 数据库系统是如何工作的!

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

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

于 2013-07-12T09:46:09.987 回答