Skip to main content

A Django 'cache_page' decorator on steroids

Project description

Copyright Peter Bengtsson, mail@peterbe.com, 2013-2016

Travis

License: BSD

About django-fancy-cache

A Django cache_page decorator on steroids.

Unlike the stock django.views.decorators.cache.change_page this decorator makes it possible to set a key_prefixer that is a callable. This callable is passed the request and if it returns None the page is not cached.

Also, you can set another callable called post_process_response (which is passed the response and the request) which can do some additional changes to the response before it’s set in cache.

Lastly, you can set post_process_response_always=True so that the post_process_response callable is always called, even when the response is coming from the cache.

How to use it

In your Django views:

from fancy_cache import cache_page

@cache_page(60 * 60)
def myview(request):
    return render(request, 'page1.html')

def prefixer(request):
    if request.method != 'GET':
        return None
    if request.GET.get('no-cache'):
        return None
    return 'myprefix'

@cache_page(60 * 60, key_prefixer=prefixer)
def myotherview(request):
    return render(request, 'page2.html')

def post_processor(response, request):
    response.content += '<!-- this was post processed -->'
    return response

@cache_page(60 * 60,
            key_prefixer=prefixer,
        post_process_response=post_processor)
def yetanotherotherview(request):
    return render(request, 'page3.html')

Optional uses

If you want to you can have django-fancy-cache record every URL it caches. This can be useful for things like invalidation or curious statistical inspection.

You can either switch this on on the decorator itself. Like this:

from fancy_cache import cache_page

@cache_page(60 * 60, remember_all_urls=True)
def myview(request):
    return render(request, 'page1.html')

Or, more conveniently to apply it to all uses of the cache_page decorator you can set the default in your settings with:

FANCY_REMEMBER_ALL_URLS = True

Now, suppose you have the this option enabled. Now you can do things like this:

>>> from fancy_cache.memory import find_urls
>>> list(find_urls(['/some/searchpath', '/or/like/*/this.*']))
>>> # or, to get all:
>>> list(find_urls([]))

There is also another option to this and that is to purge (aka. invalidate) the remembered URLs. You simply all the purge=True option like this:

>>> from fancy_cache.memory import find_urls
>>> list(find_urls([], purge=True))

Note: Since find_urls() returns a generator, the purging won’t happen unless you exhaust the generator. E.g. looping over it or turning it into a list.

The second way to inspect all recorded URLs is to use the fancy-cache management command. This is only available if you have added fancy_cache to your INSTALLED_APPS setting. Now you can do this:

$ ./manage.py fancy-cache --help
$ ./manage.py fancy-cache
$ ./manage.py fancy-cache /some/searchpath /or/like/*/this.*
$ ./manage.py fancy-cache /some/place/* --purge
$ # or to purge them all!
$ ./manage.py fancy-cache --purge

Note, it will only print out URLs that if found (and purged, if applicable).

The third way to inspect the recorded URLs is to add this to your root urls.py:

url(r'fancy-cache', include('fancy_cache.urls')),

Now, if you visit http://localhost:8000/fancy-cache you get a table listing every URL that django-fancy-cache has recorded.

Optional uses (for the exceptionally curious)

If you have enabled FANCY_REMEMBER_ALL_URLS you can also enable FANCY_REMEMBER_STATS_ALL_URLS in your settings. What this does is that it attempts to count the number of cache hits and cache misses you have for each URL.

This counting of hits and misses is configured to last “a long time”. Possibly longer than you cache your view. So, over time you can expect to have more than one miss because your view cache expires and it starts over.

You can see the stats whenever you use any of the ways described in the section above. For example like this:

>>> from fancy_cache.memory import find_urls
>>> found = list(find_urls([]))[0]
>>> found[0]
'/some/page.html'
>>> found[2]
{'hits': 1235, 'misses': 12}

There is obviously a small additional performance cost of using the FANCY_REMEMBER_ALL_URLS and/or FANCY_REMEMBER_STATS_ALL_URLS in your project so only use it if you don’t have any smarter way to invalidate, for debugging or if you really want make it possible to purge all cached responses when you run an upgrade of your site or something.

Running the test suite

The simplest way is to simply run:

$ pip install tox
$ tox

Or to run it without tox you can simply run:

$ export PYTHONPATH=`pwd`
$ export DJANGO_SETTINGS_MODULE=fancy_tests.tests.settings
$ django-admin.py test

Changelog

(Sorry, been poor in maintaining this. Let’s get it right from now)

0.8.2
  • Remove deprecated way to define URL patterns and tests in python 3.5

0.8.1
0.8.0
  • Started keeping a Changelog

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-fancy-cache-0.8.2.tar.gz (15.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

django_fancy_cache-0.8.2-py3-none-any.whl (19.6 kB view details)

Uploaded Python 3

django_fancy_cache-0.8.2-py2-none-any.whl (18.9 kB view details)

Uploaded Python 2

File details

Details for the file django-fancy-cache-0.8.2.tar.gz.

File metadata

File hashes

Hashes for django-fancy-cache-0.8.2.tar.gz
Algorithm Hash digest
SHA256 bc019aa6c21302b788e62055eea90b7207e90e4b38f7602c8442dc8c23c9fc4d
MD5 07ec6dd64be76418ac8ebe3c8833723b
BLAKE2b-256 5126de0f2d53420fa054ca46969fd4bdb73a6edcf6fc578a748bebc2887e3b21

See more details on using hashes here.

File details

Details for the file django_fancy_cache-0.8.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_fancy_cache-0.8.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c07966a4dbce1bc8699fdb31bec43a1a87bd123507b34fb213dbb3621c31580a
MD5 82153b2a8ae3d565407f81a5a075e59d
BLAKE2b-256 5d4b44b56b68cb761f16b823b2ef7dc9b6c38ee62489df758001f392e06d1282

See more details on using hashes here.

File details

Details for the file django_fancy_cache-0.8.2-py2-none-any.whl.

File metadata

File hashes

Hashes for django_fancy_cache-0.8.2-py2-none-any.whl
Algorithm Hash digest
SHA256 4ff8e08c166cd06a0d029e2d01a7d6972c806348de16019999d78ef326014473
MD5 8dbed06a0f75d9d0505b3a79078a8bce
BLAKE2b-256 72d55aea0f1e299370b93ff541856e35448be69961b1db4eaf1dacea3da8075a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page