Guest User

Untitled

a guest
May 27th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. import types
  2. from django.conf import settings
  3. from urllib import urlencode
  4. from django.core.cache.backends.base import BaseCache
  5. from django.utils.encoding import smart_str
  6.  
  7. #future-proofing against any Django upstream additions of new cache methods.
  8. # If we didn't do this, we'd silently use the base class's methods, which wouldn't
  9. # use the prefix as required.
  10. _expected_methods = set(['__contains__', '__init__', 'add', 'close',
  11. 'decr', 'delete', 'get', 'get_many', 'has_key', 'incr', 'set',
  12. '_get_memcache_timeout', 'clear', 'delete_many', 'set_many'])
  13.  
  14. class CacheClass(BaseCache):
  15. def __init__(self, server, params):
  16. #e.g. CACHE_BACKEND="path.to.prefixed://memcached://10.0.0.3:11211/?prefix=xxx"
  17. # Falls back to settings.SITE_ID if no specific prefix is given.
  18. from django.core.cache import get_cache
  19. self.prefix = smart_str(params.pop('prefix', str(settings.SITE_ID) + ':'))
  20. backend_uri = server
  21. if params:
  22. backend_uri += "?%s" % urlencode(params)
  23. self.backend = get_cache(backend_uri)
  24. actual_methods = set([m for m in dir(self.backend)
  25. if isinstance(getattr(self.backend, m), types.MethodType)])
  26. new_methods = actual_methods - _expected_methods
  27. assert not bool(new_methods), "New methods have been added to cache backend: %s." % new_methods
  28. super(CacheClass, self).__init__(params)
  29.  
  30. def get(self, key, default=None):
  31. return self.backend.get(self.prefix + key, default)
  32.  
  33. def set(self, key, value, timeout=0):
  34. return self.backend.set(self.prefix + key, value, timeout)
  35.  
  36. def delete(self, key):
  37. self.backend.delete(self.prefix + key)
  38.  
  39. def add(self, key, value, timeout=None):
  40. self.backend.add(self.prefix + key, value, timeout)
  41.  
  42. def get_many(self, keys):
  43. l_prefix = len(self.prefix)
  44. _keys = [(self.prefix + key) for key in keys]
  45. _results = self.backend.get_many(_keys)
  46. for k in _keys:
  47. if k in _results:
  48. _results[k[l_prefix:]] = _results[k]
  49. del _results[k]
  50. return _results
  51.  
  52. def has_key(self, key):
  53. return self.backend.has_key(self.prefix + key)
  54.  
  55. def incr(self, key, delta=1):
  56. return self.backend.incr(self.prefix + key, delta)
  57.  
  58. def decr(self, key, delta=1):
  59. return self.backend.incr(self.prefix + key, -delta)
  60.  
  61. def __contains__(self, key):
  62. return self.backend.has_key(self.prefix + key)
  63.  
  64. def delete_many(self, keys):
  65. _keys = [(self.prefix + key) for key in keys]
  66. self._cache.delete_multi(map(smart_str, _keys))
  67.  
  68. def set_many(self, data, timeout=0):
  69. safe_data = {}
  70. for key, value in data.items():
  71. if isinstance(value, unicode):
  72. value = value.encode('utf-8')
  73. safe_data[smart_str(self.prefix + key)] = value
  74. self._cache.set_multi(safe_data, self._get_memcache_timeout(timeout))
Add Comment
Please, Sign In to add comment