4

渡したキーが問題ないことを確認するための便利な方法や方法を誰かが知っているかどうか疑問に思っていましdjango.core.cache.set()cache.get()

https://docs.djangoproject.com/en/1.3/topics/cache/#cache-key-warningsから:

最も一般的に使用されているプロダクション キャッシュ バックエンドである Memcached では、250 文字を超えるか、空白または制御文字を含むキャッシュ キーを使用できず、そのようなキーを使用すると例外が発生します。

md5_constructor()ここでこの関数を見つけました: https://github.com/django/django/blob/master/django/utils/hashcompat.py

おそらく1つの方法は、常に使用するキーをmd5-ifiyすることですか?それが安全かどうかは100%わかりません。

4

2 に答える 2

7

カスタムキー関数https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-CACHES-KEY_FUNCTIONを使用することをお勧めします

設定で設定します。

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'KEY_FUNCTION': 'path.to.my.make_key',
        'LOCATION': [
            '127.0.0.1:11211',
        ]
    }
}

私は次のようなものを使用します:

from django.utils.encoding import smart_str

def _smart_key(key):
    return smart_str(''.join([c for c in key if ord(c) > 32 and ord(c) != 127]))

def make_key(key, key_prefix, version):
    "Truncate all keys to 250 or less and remove control characters"
    return ':'.join([key_prefix, str(version), _smart_key(key)])[:250]
于 2012-10-12T13:11:06.670 に答える
6
  1. md5_constructorhashlib.md5標準ライブラリにあり、そのdigestメソッドは長さ制限に適合する安全なキーを返すことができます。元のキーの長さが 250 より大きい場合は、それまたは他のキーを使用してキーを安全にする必要があります。
  2. 元のキーのすべての文字についてord(character) >= 33、そうでない場合は、安全でない文字をアンダースコアまたは他の安全な文字に置き換えてください。
于 2012-10-12T01:15:01.620 に答える