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
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 3 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
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).
#
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.