Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Middleware CORS simule
Si tu as deja developpe une SPA (React, Vue, Angular) qui consomme une API Django, tu as probablement vu cette erreur dans la console : "Access to fetch has been blocked by CORS policy". CORS est un mecanisme de securite des navigateurs qui empeche une page chargee depuis un domaine de faire des requetes vers un autre domaine.
Pour autoriser ces requetes cross-origin, le serveur doit ajouter des headers specifiques dans ses reponses :
Access-Control-Allow-Origin : quels domaines ont le droit de faire des requêtes (ex: 'https://example.com' ou '*' pour tout le monde)
Access-Control-Allow-Methods : quelles méthodes HTTP sont autorisees (ex: 'GET, POST, PUT, DELETE')
Access-Control-Allow-Headers : quels headers le client peut envoyer (ex: 'Content-Type, Authorization')
Il y a aussi les requêtes "preflight" : avant une requête POST ou PUT, le navigateur envoie d'abord une requête OPTIONS pour demander au serveur ce qui est autorise. Le serveur doit repondre avec les bons headers.
Tu vas créer une classe CORSMiddleware qui :
__init__(allowed_origins, allowed_methods=None) : prend une liste de domaines autorises et optionnellement une liste de méthodes (par défaut GET, POST, PUT, DELETE, OPTIONS)
process_request(request) : vérifie si le domaine d'origine (request['origin']) est dans la whitelist. Si c'est une requête OPTIONS (preflight), retourne directement une réponse avec les headers CORS et status 200. Sinon, retourne None (continue).
process_response(request, response) : ajoute les headers CORS a la réponse si l'origine est autorisee.
cors = CORSMiddleware(['https://example.com'])
req = {'method': 'OPTIONS', 'origin': 'https://example.com'}
r = cors.process_request(req)
assert r is not None and r['status'] == 200
assert r['headers']['Access-Control-Allow-Origin'] == 'https://example.com'
Preflight OPTIONS refuse
cors = CORSMiddleware(['https://example.com'])
req = {'method': 'OPTIONS', 'origin': 'https://evil.com'}
r = cors.process_request(req)
assert r is None