diff --git a/common/djangoapps/request_cache/__init__.py b/common/djangoapps/request_cache/__init__.py index e69de29bb2..7d8bf77ef6 100644 --- a/common/djangoapps/request_cache/__init__.py +++ b/common/djangoapps/request_cache/__init__.py @@ -0,0 +1,28 @@ +""" +A cache that is cleared after every request. + +This module requires that :class:`request_cache.middleware.RequestCache` +is installed in order to clear the cache after each request. +""" + + +from request_cache import middleware + + +def get_cache(name): + """ + Return the request cache named ``name``. + + Arguments: + name (str): The name of the request cache to load + + Returns: dict + """ + return middleware.RequestCache.get_request_cache(name) + + +def get_request(): + """ + Return the current request. + """ + return middleware.RequestCache.get_current_request() diff --git a/common/djangoapps/request_cache/middleware.py b/common/djangoapps/request_cache/middleware.py index 7690eac5ba..ecb85633ef 100644 --- a/common/djangoapps/request_cache/middleware.py +++ b/common/djangoapps/request_cache/middleware.py @@ -1,34 +1,48 @@ import threading -_request_cache_threadlocal = threading.local() -_request_cache_threadlocal.data = {} -_request_cache_threadlocal.request = None + +class _RequestCache(threading.local): + """ + A thread-local for storing the per-request cache. + """ + def __init__(self): + super(_RequestCache, self).__init__() + self.data = {} + self.request = None + + +REQUEST_CACHE = _RequestCache() class RequestCache(object): @classmethod - def get_request_cache(cls): - return _request_cache_threadlocal + def get_request_cache(cls, name=None): + """ + This method is deprecated. Please use :func:`request_cache.get_cache`. + """ + if name is None: + return REQUEST_CACHE + else: + return REQUEST_CACHE.data.setdefault(name, {}) @classmethod def get_current_request(cls): """ - Get a reference to the HttpRequest object, if we are presently - servicing one. + This method is deprecated. Please use :func:`request_cache.get_request`. """ - return _request_cache_threadlocal.request + return REQUEST_CACHE.request @classmethod def clear_request_cache(cls): """ Empty the request cache. """ - _request_cache_threadlocal.data = {} - _request_cache_threadlocal.request = None + REQUEST_CACHE.data = {} + REQUEST_CACHE.request = None def process_request(self, request): self.clear_request_cache() - _request_cache_threadlocal.request = request + REQUEST_CACHE.request = request return None def process_response(self, request, response):