Johnny Cache

Johnny Cache is a caching framework for django applications. It works with the django caching abstraction, but was developed specifically with the use of memcached in mind. Its main feature is a patch on Django’s ORM that automatically caches all reads in a consistent manner. It works with Django 1.1 thru 1.4 and python 2.4 thru 2.7.

You can install johnny with pip:

pip install johnny-cache

You can fork johnny-cache from its git repository:

git clone

or, if you prefer, from its hg mirror:

hg clone

Please use github’s issue tracker to report bugs. Contact the authors at @jmoiron and @finder83.


A typical file for Django 1.3 or 1.4 configured for johnny-cache:

# add johnny's middleware
    # ...
# some johnny settings
    'default' : dict(
        BACKEND = 'johnny.backends.memcached.MemcachedCache',
        LOCATION = [''],
        JOHNNY_CACHE = True,

For a full inspection of options for earlier versions of Django please see the queryset cache docs.

The MIDDLEWARE_CLASSES setting enables two middlewares: the outer one clears a thread-local dict-like cache located at johnny.cache.local at the end of every request, and should really be the outer most middleware in your stack. The second one enables the main feature of Johnny: the queryset cache.

The CACHES configuration includes a custom backend, which allows cache times of “0” to be interpreted as “forever”, and marks the default cache backend as the one Johnny will use.

Finally, the project’s name is worked into the Johnny key prefix so that if other projects are run using the same cache pool, Johnny won’t confuse the cache for one project with the cache for another.

With these settings, all of your ORM queries are now cached. You should read the queryset cache documentation closely to see if you are doing anything that might require manual invalidation.

Johnny does not define any views, urls, or models, so we can skip adding it to INSTALLED_APPS.

Note: Since Johnny is enabled by the inclusion of middleware, it will not be enabled by default in scripts, management commands, asynchronous workers, or the django shell. See the queryset cache documentation for instructions on how to enable it in these cases.

New in this version

  • Django 1.4 support
  • Redis backend (requires django-redis-cache)
  • Master/Slave support
  • Cache whitelist
  • New celery task utilities

Version Numbering

Because Johnny tracks Django’s release schedule with its own releases, and is itself a mature project, the version number has been bumped from 0.3 to 1.4 to coincide with the highest version of Django with support. In the future, Johnny’s version will track the major and minor version numbers of Django, but will have independent dot releases for bugfixes, maintenance, and backwards compatible feature enhancements.

Deprecation Policy

As of the release of Django 1.4, Django 1.1 and 1.2 are now officially unsupported projects. In addition, in an effort to clean up code in preparation for eventual Python 3.3 support, Django 1.4 drops support for Python 2.4 and Django 1.5 will drop support for Python 2.5.

Johnny 1.4 will maintain support for Django 1.1+ and Python 2.4 thru 2.7, as previous releases have had no official deprecation policies. Future versions will:

  • Adopt Django’s Python version support & deprecation policy (including py3k adoption)
  • Support the 3 most recent versions of Django

If Django development goals are met, this means that Johnny 1.5 will support Django 1.3-1.5 and Python 2.6+, with experimental Python 3.3 support. This also means that, while future versions of Johnny will be compatible with older versions of Django, they might not be compatible with all of the supported versions of python for these old versions.