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 ,

也许一种方法是 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. 对于 origin 键中的每个字符,如果没有,请确保ord(character) >= 33将 unsafe 字符替换为下划线或您喜欢的其他安全字符。
于 2012-10-12T01:15:01.620 回答