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 でサイトを開発しています。
誰かが問題を解決するのを手伝ってください。また、この種の問題をデバッグする方法はありますか?