Exercices Concepts Web & Django Middleware de logging Django
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Middleware de logging Django

Maintenant qu'on sait écrire un middleware basique, on va en faire un qui garde un historique. En vrai projet, on utiliserait le module logging de Python, mais ici on va stocker les logs dans une liste pour pouvoir les tester facilement.

L'astuce, c'est que le middleware est instancie une seule fois au demarrage de Django, puis il traite toutes les requêtes. Donc si tu stockes des données dans self, elles persistent entre les requêtes. C'est parfait pour un historique.

Quand on ecrit un middleware Django manuellement (sans MiddlewareMixin), on utilise le pattern "new style" :

class MonMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
# Code avant la vue
response = self.get_response(request)
# Code apres la vue
return response

get_response est la vue suivante (ou le middleware suivant dans la chaine). En appelant self.get_response(request), tu laisses la requête continuer son chemin et tu recuperes la réponse.

Écris un middleware LoggingMiddleware (style new) qui :
- Dans __init__, stocke get_response et initialise self.logs comme une liste vide
- Dans __call__, ajoute dans self.logs une chaine de la forme "GET /chemin" (request.method et request.path), puis appelle get_response et retourne la réponse

Exemple :

from django.http import HttpRequest, HttpResponse
mw = LoggingMiddleware(lambda r: HttpResponse('ok'))
req = HttpRequest()
req.method = 'GET'
req.path = '/home/'
mw(req)
mw.logs vaut ['GET /home/']

Tests (3/4)

Logs vides au depart
mw = LoggingMiddleware(lambda r: HttpResponse('ok'))
assert mw.logs == []
Un log enregistre
mw = LoggingMiddleware(lambda r: HttpResponse('ok'))
req = HttpRequest()
req.method = 'GET'
req.path = '/home/'
mw(req)
assert mw.logs == ['GET /home/']
Plusieurs logs
mw = LoggingMiddleware(lambda r: HttpResponse('ok'))
for path in ['/a/', '/b/']:
    req = HttpRequest()
    req.method = 'POST'
    req.path = path
    mw(req)
assert len(mw.logs) == 2 and mw.logs[0] == 'POST /a/'

+ 0 tests cachés

Indices (3 disponibles)

solution.py