Login

Safer cache key generation

Author:
cmheisel
Posted:
November 23, 2008
Language:
Python
Version:
1.0
Tags:
memcache cache caching
Score:
2 (after 2 ratings)

If any cache keys you generate include user (staff or public) supplied data, they may: be too long, contain invalid characters (at least by memcache's standards), or both.

This helper will sub out any invalid characters and md5 the key if it's too long.

Additionally, it'll insert the CACHE_MIDDLEWARE_KEY_PREFIX from django.conf.settings for you. In your memcache instances are used by multiple applications (Django or otherwise) this can help ensure your keys are unique to that a particular app on a particular site.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import md5
from django.conf import settings
def safe_cache_key(value):
    '''Returns an md5 hexdigest of value if len(value) > 250. Replaces invalid memcache
       control characters with an underscore. Also adds the CACHE_MIDDLEWARE_KEY_PREFIX
       to your keys automatically.
    '''
    for char in value:
      if ord(char) < 33:
          value = value.replace(char, '_')
    
    value = "%s_%s" % (settings.CACHE_MIDDLEWARE_KEY_PREFIX, value)
    
    if len(value) <= 250:
        return value
    
    return md5.new(value).hexdigest()

More like this

  1. Scalable and invalidateble cache_page decorator by marinho 6 years, 2 months ago
  2. Function cache decorator by bradbeattie 2 years, 8 months ago
  3. Another Memcache Status View by cmheisel 7 years, 5 months ago
  4. MintCache (simple version) by disqus 7 years, 1 month ago
  5. Clean-ish memcached key generation by iiie 2 years, 10 months ago

Comments

pigletto (on November 24, 2008):

I was looking for this kind of cache key generator for memcached recently and here it is :)

One thing that might be considered when using this snippet is to replace md5 by hashlib library if you tend to use newer python version (md5 is deprecated in python2.5).

#

bthomas (on December 18, 2008):

Actually, you can use django.utils.hashcompat.md5_constructor, which will use hashlib when available, and fallback to the old md5 import. The last line would be md5_constructor(value).digest()

#

Please login first before commenting.