2012-10-11 91 views
3

我想知道是否有人知道一個方便的方法或方法,以確保您通過的密鑰django.core.cache.set()cache.get()都可以。什麼是防止memcached CacheKeyWarning的好方法/結構化方法?

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

您可能需要使用自定義按鍵功能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] 
+0

'key'是字典,而不是字符串。應該是'str(key)'。 – sikmir

+1

@sikmir nope。 'key'是一個字符串。 – Germano

4
  1. md5_constructor是標準庫hashlib.md5,其digest方法可以返回安全密鑰適合長度的限制。如果原始密鑰的長度大於250,則應該使用它或其他密鑰來確保密鑰安全。
  2. 對於原始鍵中的每個字符,請確保ord(character) >= 33,如果不是,請用不滿意的字符替換下劃線或您喜歡的其他安全字符。
相關問題