diff options
Diffstat (limited to 'webapp/django/core/cache/__init__.py')
-rw-r--r-- | webapp/django/core/cache/__init__.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/webapp/django/core/cache/__init__.py b/webapp/django/core/cache/__init__.py new file mode 100644 index 0000000000..93e7adb76e --- /dev/null +++ b/webapp/django/core/cache/__init__.py @@ -0,0 +1,64 @@ +""" +Caching framework. + +This package defines set of cache backends that all conform to a simple API. +In a nutshell, a cache is a set of values -- which can be any object that +may be pickled -- identified by string keys. For the complete API, see +the abstract BaseCache class in django.core.cache.backends.base. + +Client code should not access a cache backend directly; instead it should +either use the "cache" variable made available here, or it should use the +get_cache() function made available here. get_cache() takes a backend URI +(e.g. "memcached://127.0.0.1:11211/") and returns an instance of a backend +cache class. + +See docs/cache.txt for information on the public API. +""" + +from cgi import parse_qsl +from django.conf import settings +from django.core import signals +from django.core.cache.backends.base import InvalidCacheBackendError + +# Name for use in settings file --> name of module in "backends" directory. +# Any backend scheme that is not in this dictionary is treated as a Python +# import path to a custom backend. +BACKENDS = { + 'memcached': 'memcached', + 'locmem': 'locmem', + 'file': 'filebased', + 'db': 'db', + 'dummy': 'dummy', +} + +def get_cache(backend_uri): + if backend_uri.find(':') == -1: + raise InvalidCacheBackendError, "Backend URI must start with scheme://" + scheme, rest = backend_uri.split(':', 1) + if not rest.startswith('//'): + raise InvalidCacheBackendError, "Backend URI must start with scheme://" + + host = rest[2:] + qpos = rest.find('?') + if qpos != -1: + params = dict(parse_qsl(rest[qpos+1:])) + host = rest[2:qpos] + else: + params = {} + if host.endswith('/'): + host = host[:-1] + + if scheme in BACKENDS: + module = __import__('django.core.cache.backends.%s' % BACKENDS[scheme], {}, {}, ['']) + else: + module = __import__(scheme, {}, {}, ['']) + return getattr(module, 'CacheClass')(host, params) + +cache = get_cache(settings.CACHE_BACKEND) + +# Some caches -- pythont-memcached in particular -- need to do a cleanup at the +# end of a request cycle. If the cache provides a close() method, wire it up +# here. +if hasattr(cache, 'close'): + signals.request_finished.connect(cache.close) + |