Caching
Django · Reference cheat sheet
Caching
Django · Reference cheat sheet
📋 Overview
Django’s cache framework stores expensive results (pages, fragments, query results) behind a pluggable backend: local memory, Memcached, Redis, database, or file. Configure CACHES, then use the low-level API, per-view decorators, or template fragment caching.
🔧 Core concepts
| Layer | API |
|---|---|
| Low-level | cache.get / set / add / delete / get_or_set |
| Per-view | @cache_page(timeout) |
| Template | \{% cache timeout fragment_name %\} |
| Middleware | UpdateCacheMiddleware + FetchFromCacheMiddleware |
| Keys | make_template_fragment_key, versioning via KEY_PREFIX / VERSION |
Backends: LocMemCache (dev), RedisCache (Django 4.0+), Memcached, DB, file.
💡 Examples
Settings (Redis):
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"KEY_PREFIX": "myapp",
"TIMEOUT": 300,
}
}Low-level:
from django.core.cache import cache
def get_article(slug: str):
key = f"article:{slug}"
article = cache.get(key)
if article is None:
article = Article.objects.select_related("author").get(slug=slug)
cache.set(key, article, timeout=60 * 10)
return articleView + template fragment:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def homepage(request):
...{% load cache %}
{% cache 500 sidebar request.user.pk %}
... expensive ...
{% endcache %}⚠️ Pitfalls
- Caching personalized pages without varying on user/session → data leaks.
LocMemCacheis per-process—wrong for multi-worker production.- Stale cache after writes—invalidate keys in signals/services.
- Pickling large querysets—cache IDs or rendered HTML instead.
- Forgetting
KEY_PREFIXwhen sharing Redis across apps.