Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Routeur d'URLs
Un routeur complet gere plusieurs routes. Tu enregistres des patterns avec les handlers correspondants, et quand une URL arrive, le routeur trouve le bon handler.
Écris une classe Router avec : - ajouter(pattern, handler_name) : enregistre une route - resoudre(url) : retourne un tuple (handler_name, params_dict) pour la première route qui matche, ou None si aucune route ne correspond
Le pattern utilise <param> pour les segments dynamiques, comme dans l'exercice précédent.
Exemple : r = Router() r.ajouter('/users/<id>', 'user_detail') r.resoudre('/users/42') renvoie ('user_detail', {'id': '42'}) r.resoudre('/posts/1') renvoie None
Tests (2/4)
Route trouvee
r = Router()
r.ajouter('/users/<id>', 'user_detail')
result = r.resoudre('/users/42')
assert result == ('user_detail', {'id': '42'})
Pas trouvee
r = Router()
r.ajouter('/users/<id>', 'user_detail')
assert r.resoudre('/posts/1') is None
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
class Router:
def __init__(self):
self.routes = []
def ajouter(self, pattern, handler_name):
self.routes.append((pattern, handler_name))
def resoudre(self, url):
u_parts = url.strip('/').split('/')
for pattern, handler in self.routes:
p_parts = pattern.strip('/').split('/')
if len(p_parts) != len(u_parts):
continue
params = {}
ok = True
for p, u in zip(p_parts, u_parts):
if p.startswith('<') and p.endswith('>'):
params[p[1:-1]] = u
elif p != u:
ok = False
break
if ok:
return (handler, params)
return None