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
-----------------------