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 例外値: 10 進数の無効なリテラル: '\xc3\x85\xc3\x84\xc3\xa13\xc2\xa6\x0f(u'

デバッグで、「to_python()」が正しく機能していないことがわかりました。(django-fields git のコードソース)。views.py を介して取得すると、実際の値ではなく暗号化された文字列が画面に表示されるというエラーが発生します。

同じ問題を抱えているstackoverflowに関する質問が1つ見つかりましたが、異なるPythonバージョンのメタクラス構文のために修正されました。私の Python バージョン 2.7.5 と Django 1.4.5、私は Windows 7 でサイトを開発しています。

誰かが問題を解決するのを手伝ってください。また、この種の問題をデバッグする方法はありますか?

4

1 に答える 1

1

最後に答えを得ました:)

SQLite データベース システムのしくみを理解する必要がありました。

ここでの問題は、使用しているデータベースがその場合に任意になることです。まず、格納するデータをフォーマットします。タイプがデータベーステーブルフィールドに割り当てられると(理由はわかりません)、他の形式のデータを保存できます(SQLiteのバグの可能性があります。テーブルには整数フィールドがありましたが、350文字の長い文字列が保存され、コマンドラインが表示されました) . 検索が完了すると問題が発生します。データベース SW はフィールドから整数値を探しますが、サポートされていない値をいくつか取得します。(したがって、エラー)。

私の質問は、前述の段落の括弧内の質問に移されたのでしょうか? それは本当ですか (それは私にそのように証明されたからです) または他の理由はありますか?

于 2013-07-12T09:46:09.987 に答える