Exercices Concepts Web & Django Premier middleware Django
🎉

Bravo!

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

Premier middleware Django

Dans Django, un middleware est une classe qui se place entre la requête entrante et la vue qui va la traiter. Chaque requête HTTP passe par tous les middlewares, dans l'ordre, avant d'atteindre la vue. Et la réponse repasse par les memes middlewares, en sens inverse.

C'est comme une série de filtres dans un système de purification d'eau : l'eau passe par chaque filtre en entrant, et peut repasser par d'autres en sortant.

Django fournit une classe MiddlewareMixin qui facilite l'écriture de middlewares. Tu dois definir une classe avec deux méthodes optionnelles :

process_request(self, request) : appelee avant la vue
process_response(self, request, response) : appelee apres la vue

Si process_request retourne None, la requête continue son chemin. Si elle retourne une HttpResponse, la requête est court-circuitee (la vue n'est jamais appelee).

Voici un exemple de middleware qui ajoute un attribut a la requête :

from django.utils.deprecation import MiddlewareMixin

class MonMiddleware(MiddlewareMixin):
def process_request(self, request):
request.mon_attribut = 'bonjour'
return None

Écris un middleware AddRequestIdMiddleware qui :
- Dans process_request, ajoute un attribut request_id a la requête avec la valeur 'REQ-001'
- Dans process_response, ajoute un header 'X-Request-Id' a la réponse avec la meme valeur 'REQ-001'
- process_request retourne None (la requête continue)
- process_response retourne la réponse modifiee

Exemple :

from django.http import HttpRequest, HttpResponse
mw = AddRequestIdMiddleware(lambda r: HttpResponse('ok'))
req = HttpRequest()
mw.process_request(req)
req.request_id vaut 'REQ-001'

Tests (3/4)

request_id ajoute
req = HttpRequest()
mw = AddRequestIdMiddleware(lambda r: HttpResponse('ok'))
mw.process_request(req)
assert req.request_id == 'REQ-001'
process_request retourne None
req = HttpRequest()
mw = AddRequestIdMiddleware(lambda r: HttpResponse('ok'))
result = mw.process_request(req)
assert result is None
Header X-Request-Id ajoute
req = HttpRequest()
resp = HttpResponse('ok')
mw = AddRequestIdMiddleware(lambda r: HttpResponse('ok'))
mw.process_request(req)
result = mw.process_response(req, resp)
assert result['X-Request-Id'] == 'REQ-001'

+ 0 tests cachés

Indices (3 disponibles)

solution.py