Si vous êtes développeur Django, vous êtes probablement familier avec django.core.cache (cache côté serveur). Cependant, Django propose également un autre ensemble d'outils puissants, django.utils.cache, qui permet de contrôler efficacement la mise en cache HTTP. Ce module se concentre sur la gestion des en-têtes HTTP essentiels qui réduisent la charge du serveur et améliorent l'expérience utilisateur.

Dans cet article, nous examinerons les principales fonctionnalités et l'utilisation de django.utils.cache.


django.core.cache vs django.utils.cache



Il est important de clarifier cela dès le départ.

  • django.core.cache (cache côté serveur) :

    • Stocke les résultats des requêtes de base de données, les résultats de calculs complexes, certaines parties des templates dans la mémoire serveur (RAM), Redis, Memcached, etc.
    • Objectif : Réduire la charge de calcul interne du serveur pour augmenter la vitesse de génération des réponses.
  • django.utils.cache (cache HTTP / cache côté client) :

    • Permet de définir des en-têtes de réponse HTTP, tels que Cache-Control, Vary, ETag, Last-Modified.
    • Objectif : Indiquer aux navigateurs ou serveurs proxy de mettre en cache la réponse, afin que lorsqu'une demande identique se produit, ils utilisent la réponse mise en cache au lieu de faire une nouvelle requête au serveur.

En résumé, core.cache gère le cache des données, tandis que utils.cache contrôle comment mettre en cache les réponses HTTP.


Principaux décorateurs et fonctionnalités

Le module django.utils.cache est principalement utilisé sous forme de décorateurs appliqués aux vues.

1. @cache_control

C'est le décorateur le plus basique mais le plus puissant. Il vous permet de contrôler finement l'en-tête HTTP Cache-Control.

  • max_age : Durée de validité du cache (en secondes). Le navigateur utilise la version mise en cache durant cette période.
  • public=True : Indique que la réponse peut être stockée dans un cache public (ex : CDN, proxy).
  • private=True : Indique que la réponse doit être stockée uniquement dans un cache privé (comme celui du navigateur de l'utilisateur). (Utilisé généralement avec max_age)
  • no_cache : Force toujours le navigateur à valider auprès du serveur avant d'utiliser le cache.
  • no_store : Indique que la réponse ne doit jamais être mise en cache.

Exemple :

# views.py
from django.utils.cache import cache_control

# Stocke la réponse de cette vue dans le cache du navigateur pendant 1 heure (3600 secondes)
@cache_control(max_age=3600)
def my_public_view(request):
    # ...
    return response

# Cette vue contient des informations sensibles, donc elle est seulement stockée dans le cache privé (navigateur) pendant 30 minutes
@cache_control(private=True, max_age=1800)
def user_profile_view(request):
    # ...
    return response

2. @never_cache

Comme son nom l'indique, ce décorateur indique de ne jamais mettre en cache la réponse de cette vue.

Il ajoute l'en-tête Cache-Control: max-age=0, no-cache, no-store, must-revalidate, indiquant fermement au navigateur de ne pas mettre en cache la réponse.

Exemple : (Utilisé principalement sur les pages de paiement, les pages de soumission de formulaires importants, etc.)

# views.py
from django.utils.cache import never_cache

@never_cache
def sensitive_form_view(request):
    # ...
    return response

Utilisé pour définir l'en-tête Vary. Cet en-tête joue un rôle essentiel en indiquant dans quelles conditions la réponse mise en cache peut varier.

Par exemple, avec @vary_on_headers('User-Agent'), lorsque vous fournissez un HTML différent selon que l'utilisateur est sur mobile ou ordinateur, le cache fait la distinction entre les deux lors de l'enregistrement.

@vary_on_cookie est utilisé lorsque le contenu de la vue varie en fonction de la valeur d'un cookie. (Ex : lorsque le statut de connexion/déconnexion varie selon un cookie de session)

Exemple :

# views.py
from django.views.decorators.vary import vary_on_headers, vary_on_cookie

# Enregistre le cache séparément selon User-Agent (mobile/desktop) et Accept-Language (paramètres de langue)
@vary_on_headers('User-Agent', 'Accept-Language')
def content_view(request):
    # ...
    return response

# Vue dont le contenu varie selon le cookie (session)
@vary_on_cookie
def user_specific_view(request):
    # ...
    return response

Résumé



django.utils.cache est un module clé qui aide Django à respecter les normes HTTP et à gérer finement la mise en cache côté client.

Le bon réglage des en-têtes Cache-Control et Vary est une stratégie clé pour réduire considérablement le trafic serveur et offrir aux utilisateurs une vitesse de chargement plus rapide. En particulier, en utilisant les décorateurs de ce module pour les contenus statiques ou les pages de liste qui changent rarement, vous pouvez espérer un gain de performance important.