00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.