Cache
Il caching e una delle tecniche piu efficaci per migliorare le prestazioni di unâapplicazione web. Django offre un framework di caching flessibile e potente che supporta diversi backend, dal semplice caching in memoria fino a soluzioni distribuite come Redis e Memcached.
Configurazione del Backend di Cache
La configurazione della cache avviene nel file settings.py attraverso il dizionario CACHES. Django supporta diversi backend:
Memcached
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
"LOCATION": "127.0.0.1:11211",
}
}
Redis
Redis e il backend consigliato per Django 5.x, supportato nativamente:
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
}
}
Database
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.db.DatabaseCache",
"LOCATION": "tabella_cache",
}
}
Per il backend database, devi creare la tabella con il comando:
python manage.py createcachetable
File System
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
"LOCATION": "/var/tmp/django_cache",
}
}
Memoria Locale
Ideale per lo sviluppo, ma non adatta alla produzione:
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
"LOCATION": "cache-unica",
}
}
Cache Per-View con @cache_page
Il modo piu semplice per aggiungere il caching e decorare una view con @cache_page:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # Cache per 15 minuti
def lista_articoli(request):
articoli = Articolo.objects.all()
return render(request, "articoli/lista.html", {"articoli": articoli})
Puoi anche applicare il caching direttamente nelle URL:
from django.views.decorators.cache import cache_page
urlpatterns = [
path("articoli/", cache_page(60 * 15)(lista_articoli), name="lista-articoli"),
]
Cache dei Frammenti di Template
Django permette di memorizzare in cache porzioni specifiche di un template:
{% load cache %}
{% cache 600 sidebar %}
<div class="sidebar">
<!-- Contenuto pesante da generare -->
{% for categoria in categorie %}
<a href="{{ categoria.url }}">{{ categoria.nome }}</a>
{% endfor %}
</div>
{% endcache %}
Puoi anche variare la cache in base allâutente:
{% cache 600 sidebar request.user.id %}
<!-- Sidebar personalizzata per utente -->
{% endcache %}
API di Cache a Basso Livello
Per un controllo completo, Django offre unâAPI di cache programmatica:
from django.core.cache import cache
# Impostare un valore in cache
cache.set("mia_chiave", "mio_valore", timeout=300) # 5 minuti
# Recuperare un valore dalla cache
valore = cache.get("mia_chiave")
# Restituisce None se la chiave non esiste
# Valore predefinito se la chiave non esiste
valore = cache.get("chiave_inesistente", "valore_default")
# Impostare solo se la chiave non esiste gia
cache.add("nuova_chiave", "nuovo_valore", timeout=600)
# Eliminare una chiave dalla cache
cache.delete("mia_chiave")
# Impostare piu valori contemporaneamente
cache.set_many({"chiave1": "valore1", "chiave2": "valore2"}, timeout=300)
# Recuperare piu valori contemporaneamente
valori = cache.get_many(["chiave1", "chiave2"])
# Incrementare e decrementare valori numerici
cache.set("contatore", 1)
cache.incr("contatore") # 2
cache.decr("contatore") # 1
# Svuotare tutta la cache
cache.clear()
Esempio Pratico
Un pattern comune e quello di usare la cache per evitare query ripetute:
from django.core.cache import cache
def get_articoli_popolari():
chiave = "articoli_popolari"
articoli = cache.get(chiave)
if articoli is None:
articoli = list(
Articolo.objects.filter(pubblicato=True)
.order_by("-visualizzazioni")[:10]
)
cache.set(chiave, articoli, timeout=60 * 30)
return articoli
Conclusione
Il framework di caching di Django e uno strumento essenziale per ottimizzare le prestazioni. Scegli il backend piu adatto al tuo progetto: Redis per la produzione, memoria locale per lo sviluppo. Combina il caching per-view, i frammenti di template e lâAPI a basso livello per ottenere il massimo beneficio senza sacrificare la freschezza dei dati.