Skip to main content

Lazy Django fragment cache sweeping

Project description

Fragment cache invalidation by using a per model version token to prefix the cache keys. The version token can either be an internal memcached counter or a timestamped attribute from the model, such as updated_at.

Installation

Install with pip or with python setup.py install and add ‘cachesweeper’ to your settings.INSTALLED_APPS

post_save cache sweeper

An example setup; an article has many comments, each comment is cached, a single vote should invalidate the comment’s specific cached fragment as well as the total article’s page.

Template fragment caching

{% cachesweeper %} takes a Django ORM model as its first argument, the expiry time as its second and any following arguments are used to construct the rest of the cache key

{% load markup %}
{% load cachesweeper_tags %}
{% cachesweeper comment 500 "comment.xml" %}
<p>
    <strong>{{comment.user}}</strong> said at {{comment.created_at}}:<br/>
    {{comment.content|markdown}}
    <br/>
    <a href={% url like article_id=article.pk,comment_id=comment.pk %}>Like ({{comment.likes.count}})</a>
    <a href={% url dislike article_id=article.pk,comment_id=comment.pk %}>Dislike ({{comment.dislikes.count}})</a>
</p>
{% endcachesweeper %}

Invalidating the fragment when the model changes

On a post_save invalidate the cache for the given model. There are two options, either have Memcached keep an internal version counter for each model or using the keyword using as a means of versioning the cache.

from cachesweeper.utils import invalidate_cache_for

# using Memcached's internal counter
def invalidate_vote_cache(sender, **kwargs):
    vote = kwargs.get('instance')
    invalidate_cache_for(vote.comment)

post_save.connect(invalidate_vote_cache, sender=Vote)


# using a model's attribute
def invalidate_article_cache(sender, **kwargs):
    article = kwargs.get('instance')
    invalidate_cache_for(article, using='updated_at')

post_save.connect(invalidate_article_cache, sender=Article)

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-cache-sweeper-0.1.2.tar.gz (6.2 kB view details)

Uploaded Source

Built Distribution

django_cache_sweeper-0.1.2-py2.6.egg (14.8 kB view details)

Uploaded Source

File details

Details for the file django-cache-sweeper-0.1.2.tar.gz.

File metadata

File hashes

Hashes for django-cache-sweeper-0.1.2.tar.gz
Algorithm Hash digest
SHA256 f2c89a3ffce1cb92e317c24d65fabff2ce00e7ee44b5cffc9e5fc8d07ec4d2f6
MD5 02545bd319d1027c61f8df0ccc486332
BLAKE2b-256 716ff570d5c1b4069e8b07873810a058a26bb4d768433b6e86d6c1340691978e

See more details on using hashes here.

File details

Details for the file django_cache_sweeper-0.1.2-py2.6.egg.

File metadata

File hashes

Hashes for django_cache_sweeper-0.1.2-py2.6.egg
Algorithm Hash digest
SHA256 12e03eb3a666aff8f3b707b3f292a6d0d72f46dd4cc7a4a821ceb6b7c4a53cbb
MD5 d67e13dc942fa4c469cb98966cd23076
BLAKE2b-256 98152b75cfb8b17281e269cdc7601113b6a03a814add3b681dd2119dc8b93db5

See more details on using hashes here.

Supported by

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