django-orchestra/orchestra/core/caches.py

46 lines
1.3 KiB
Python
Raw Normal View History

2014-07-21 12:20:04 +00:00
from threading import currentThread
from django.core.cache.backends.dummy import DummyCache
2014-07-21 12:20:04 +00:00
from django.core.cache.backends.locmem import LocMemCache
_request_cache = {}
class RequestCache(LocMemCache):
""" LocMemCache is a threadsafe local memory cache """
def __init__(self):
name = 'locmemcache@%i' % hash(currentThread())
super(RequestCache, self).__init__(name, {})
def get_request_cache():
"""
Returns per-request cache when running RequestCacheMiddleware otherwise a
DummyCache instance (when running periodic tasks, tests or shell)
2014-07-21 12:20:04 +00:00
"""
try:
return _request_cache[currentThread()]
except KeyError:
return DummyCache('dummy', {})
2014-07-21 12:20:04 +00:00
class RequestCacheMiddleware(object):
def process_request(self, request):
current_thread = currentThread()
cache = _request_cache.get(current_thread, RequestCache())
_request_cache[current_thread] = cache
2014-07-21 12:20:04 +00:00
cache.clear()
def clear_cache(self):
current_thread = currentThread()
2014-07-21 12:20:04 +00:00
if currentThread() in _request_cache:
_request_cache[current_thread].clear()
def process_exception(self, request, exception):
self.clear_cache()
def process_response(self, request, response):
self.clear_cache()
2014-07-21 12:20:04 +00:00
return response