La mise en cache est une technique essentielle pour réduire la latence des applications web. En stockant le résultat de calculs coûteux ou de requêtes complexes en mémoiree, Django permet de servir les requêtes ultérieures quasi instantanément, améliorant ainsi l'expérience utilisateur et soulageant la base de données.
Principe de fonctionnement
Le flux logique d'un système de cache suit généralement ces étapes :
- Le client envoie une requête vers une URL spécifique.
- Le serveur intercepte la requête et vérifie si une réponse correspondante existe déjà dans le cache.
- Cache Hit : Si la donnée est présente, elle est renvoyée immédiatement sans traitement supplémentaire.
- Cache Miss : Si la donnée est absente, la vue exécute la logique métier (accès à la base de données, calculs).
- Le serveur stocke le résultat dans le cache pour une durée déterminée (TTL) avant de renvoyer la réponse au client.
Configuration des backends de stockage
Django supporte plusieurs types de stockage pour le cache via le dictionnaire CACHES dans le fichier settings.py.
1. Cache en base de données
Utile si vous ne disposez pas d'un serveur de cache dédié. Il faut d'abord créer la table de cache :
python manage.py createcachetable ma_table_cache
Configuration :
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'ma_table_cache',
'TIMEOUT': 300, # 5 minutes
}
}
2. Cache avec Redis
Redis est l'une des solutions les plus performantes. Elle nécessite l'installation du paquet django-redis.
CACHES = {
'redis_backend': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
3. Cache avec Memcached
Memcached est un service de cache distribué très populaire. Pour l'utiliser avec Python, installez python-memcached ou pylibmc.
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '127.0.0.1:11211',
}
}
4. Cache sur système de fichiers
Stocke les données sérialisées sous forme de fichiers individuels.
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
Utilisation dans le code
Il existe deux approches principales pour implémenter le cache au niveau applicatif.
A. Utilisation des décorateurs de vue
Le décorateur cache_page permet de mettre en cache l'intégralité du rendu d'une vue pour une durée précise.
from django.views.decorators.cache import cache_page
from django.http import HttpResponse
import time
@cache_page(120, cache='redis_backend', key_prefix='catalogue')
def liste_produits(request):
# Simulation d'un traitement lourd
time.sleep(2)
return HttpResponse("Affichage de la liste des produits")
B. API de bas niveau (Low-level Cache API)
Pour un contrôle plus granulaire sur les données spécfiiques à mettre en cache.
from django.core.cache import caches
from django.shortcuts import render
def vue_actualites(request):
# Sélection du backend spécifique
cache_system = caches['redis_backend']
cle_cache = "dernieres_news"
contenu = cache_system.get(cle_cache)
if contenu is None:
# Si le cache est vide, on génère les données
items = []
for i in range(5):
items.append(f"Actualité système numéro {i}")
# Simulation d'un délai réseau ou DB
import time
time.sleep(3)
reponse = render(request, 'news.html', {'news': items})
# Sauvegarde du contenu HTML de la réponse
cache_system.set(cle_cache, reponse.content, timeout=3600)
return reponse
return HttpResponse(contenu)