cache.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from mako import exceptions
  2. try:
  3. from beaker import cache
  4. cache = cache.CacheManager()
  5. except ImportError:
  6. cache = None
  7. class Cache(object):
  8. def __init__(self, id, starttime):
  9. self.id = id
  10. self.starttime = starttime
  11. self.def_regions = {}
  12. def put(self, key, value, **kwargs):
  13. defname = kwargs.pop('defname', None)
  14. expiretime = kwargs.pop('expiretime', None)
  15. createfunc = kwargs.pop('createfunc', None)
  16. self._get_cache(defname, **kwargs).put_value(key, starttime=self.starttime, expiretime=expiretime)
  17. def get(self, key, **kwargs):
  18. defname = kwargs.pop('defname', None)
  19. expiretime = kwargs.pop('expiretime', None)
  20. createfunc = kwargs.pop('createfunc', None)
  21. return self._get_cache(defname, **kwargs).get_value(key, starttime=self.starttime, expiretime=expiretime, createfunc=createfunc)
  22. def invalidate(self, key, **kwargs):
  23. defname = kwargs.pop('defname', None)
  24. expiretime = kwargs.pop('expiretime', None)
  25. createfunc = kwargs.pop('createfunc', None)
  26. self._get_cache(defname, **kwargs).remove_value(key, starttime=self.starttime, expiretime=expiretime)
  27. def invalidate_body(self):
  28. self.invalidate('render_body', defname='render_body')
  29. def invalidate_def(self, name):
  30. self.invalidate('render_%s' % name, defname='render_%s' % name)
  31. def invalidate_closure(self, name):
  32. self.invalidate(name, defname=name)
  33. def _get_cache(self, defname, type=None, **kw):
  34. if not cache:
  35. raise exceptions.RuntimeException("the Beaker package is required to use cache functionality.")
  36. if type == 'memcached':
  37. type = 'ext:memcached'
  38. if not type:
  39. (type, kw) = self.def_regions.get(defname, ('memory', {}))
  40. else:
  41. self.def_regions[defname] = (type, kw)
  42. return cache.get_cache(self.id, type=type, **kw)