How do you disable Django caching on a per checkout basis?

Back before Django 1.3, I could disable caching for my local development checkout by specifying CACHE_BACKEND = None, in a settings_local.py imported by settings.py. The settings_local.py was ignored by SVN, so I could always ensure my local environment didn’t cache, while not have to worry about modifying the cache params in settings.py.

Now, with Django 1.3, and the new CACHES = {…} structure, setting CACHES = None or CACHES['default']['BACKEND'] = None causes Django to choke, and setting CACHES = {} still seems to enable basic caching.

Dummy Caching (for development) – this implements the cache interface, but doesn’t actually cache so you could have it on your development/testing site to reduce caching and also prevent errors from caching, if those should arise.

Finally, Django comes with a “dummy” cache that doesn’t actually cache – it just implements the cache interface without doing anything.

This is useful if you have a production site that uses heavy-duty caching in various places but a development/test environment where you don’t want to cache and don’t want to have to change your code to special-case the latter. To activate dummy caching, set BACKEND like so:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

I use this in my settings, so it’s a bit more flexible i case I do want to test the usage of the deployed caching (in this case memcache)

TEST_MEMCACHE = False
if not DEBUG or TEST_MEMCACHE:
    CACHES = {
        'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        }
    }
else:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        }
}

Solution for multiple caches, and you want to disable all of them:

if True:
    CACHES = {
        k : {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',}
        for k,v in CACHES.iteritems()
    }

Solution if you want to disable some caches, may help:

if True:
    disable_names = [ 'cache_name' ]
    for name in disable_names:
        CACHES[name] = {'BACKEND' : 'django.core.cache.backends.dummy.DummyCache',}

Whilst using DRF, on some views, I would enable caching using django.views.decorators.cache.cache_page. The accepted answer did not work for me and I resorted to clearing the cache on tear down

from django.core.cache import cache
from rest_framework.test import APITestCase

class SomeTestCase(APITestCase):

    def tearDown(self):
        cache.clear()

For that purpose you can use “dummy” cache backend. Django comes with a “dummy” cache that doesn’t actually cache — it just implements the cache interface without doing anything.

Here are the old style and new style configuration formats.

  1. old style

    To activate dummy caching, set CACHE_BACKEND like so:

    CACHE_BACKEND = 'dummy://'

  2. new style

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        }
    }