From 7c33cc7f5ef4597b55dde561c1752db4d0feaca1 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Fri, 25 Jul 2008 18:51:32 +0000 Subject: [PATCH] Fixed #7398 -- Allow for custom cache-backends to be used. Based on a patch from Lau Bech Lauritzen and Brenton Simpson. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8075 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 2 ++ django/core/cache/__init__.py | 13 ++++++++----- docs/cache.txt | 25 +++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index e22ee45cbf..8e05c927d8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -236,6 +236,7 @@ answer newbie questions, and generally made Django that much better: Stuart Langridge Paul Lanier Nicola Larosa + Lau Bech Lauritzen Rune Rønde Laursen Eugene Lazutkin lcordier@point45.com @@ -341,6 +342,7 @@ answer newbie questions, and generally made Django that much better: Pete Shinners Leo Shklovskii jason.sidabras@gmail.com + Brenton Simpson Jozko Skrablin Ben Slavin sloonz diff --git a/django/core/cache/__init__.py b/django/core/cache/__init__.py index 495cc92822..27f7a3b06c 100644 --- a/django/core/cache/__init__.py +++ b/django/core/cache/__init__.py @@ -19,8 +19,10 @@ from cgi import parse_qsl from django.conf import settings 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 = { - # name for use in settings file --> name of module in "backends" directory 'memcached': 'memcached', 'locmem': 'locmem', 'file': 'filebased', @@ -44,8 +46,6 @@ def get_cache(backend_uri): warnings.warn("'%s' backend is deprecated. Use '%s' instead." % (scheme, DEPRECATED_BACKENDS[scheme]), DeprecationWarning) scheme = DEPRECATED_BACKENDS[scheme] - if scheme not in BACKENDS: - raise InvalidCacheBackendError, "%r is not a valid cache backend" % scheme host = rest[2:] qpos = rest.find('?') @@ -57,7 +57,10 @@ def get_cache(backend_uri): if host.endswith('/'): host = host[:-1] - cache_class = getattr(__import__('django.core.cache.backends.%s' % BACKENDS[scheme], {}, {}, ['']), 'CacheClass') - return cache_class(host, params) + 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) diff --git a/docs/cache.txt b/docs/cache.txt index 3318b2ad4a..392fef8f5b 100644 --- a/docs/cache.txt +++ b/docs/cache.txt @@ -6,8 +6,8 @@ A fundamental tradeoff in dynamic Web sites is, well, they're dynamic. Each time a user requests a page, the Web server makes all sorts of calculations -- from database queries to template rendering to business logic -- to create the page that your site's visitor sees. This is a lot more expensive, from a -processing-overhead perspective, than your standard read-a-file-off-the-filesystem -server arrangement. +processing-overhead perspective, than your standard +read-a-file-off-the-filesystem server arrangement. For most Web applications, this overhead isn't a big deal. Most Web applications aren't washingtonpost.com or slashdot.org; they're simply small- @@ -186,6 +186,27 @@ production environment still will. To activate dummy caching, set CACHE_BACKEND = 'dummy:///' +Using a custom cache backend +---------------------------- + +**New in Django development version** + +While Django includes support for a number of cache backends out-of-the-box, +sometimes you will want to use a customised verison or your own backend. To +use an external cache backend with Django, use a Python import path as the +scheme portion (the part before the initial colon) of the ``CACHE_BACKEND`` +URI, like so:: + + CACHE_BACKEND = 'path.to.backend://' + +If you're building your own backend, you can use the standard cache backends +as reference implementations. You'll find the code in the +``django/core/cache/backends/`` directory of the Django source. + +Note: Without a really compelling reason, like a host that doesn't support the +them, you should stick to the cache backends included with Django. They've +been really well-tested and are quite easy to use. + CACHE_BACKEND arguments -----------------------