Exercices Django Avancé Router simule
🎉

Bravo!

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

Router simule

En production avec DRF, tu ne definis pas les URLs a la main. Tu enregistres tes ViewSets dans un Router, et il genere automatiquement toutes les routes REST. C'est un gain de temps enorme sur les vrais projets.

Par exemple, si tu enregistres un ArticleViewSet sous le prefix 'articles', le Router cree :

GET /articles/ -> list
POST /articles/ -> create
GET /articles/1/ -> retrieve (pk=1)
PUT /articles/1/ -> update (pk=1)
DELETE /articles/1/ -> destroy (pk=1)

Tu vas créer une classe SimpleRouter qui :

register(prefix, viewset) : enregistre un ViewSet sous un prefix d'URL. Plusieurs ViewSets peuvent etre enregistres.

resolve(method, path) : prend une méthode HTTP et un chemin d'URL, et retourne le résultat du bon ViewSet. Le chemin est de la forme '/prefix/' pour les collections et '/prefix/id/' pour les details. L'id est toujours un entier. Si le chemin ne correspond a aucun ViewSet, retourne {'status': 404, 'error': 'Route non trouvee'}.

Exemple :

router = SimpleRouter()
router.register('articles', ArticleViewSet())

router.resolve('POST', '/articles/', data={'title': 'Hello'})
renvoie {'status': 201, 'data': {'id': 1, 'title': 'Hello'}}

router.resolve('GET', '/articles/1/')
renvoie {'status': 200, 'data': {'id': 1, 'title': 'Hello'}}

Tu peux reutiliser la classe ArticleViewSet de l'exercice précédent (elle est fournie dans le starter code).

Tests (4/5)

Register et resolve list
router = SimpleRouter()
router.register('articles', ArticleViewSet())
r = router.resolve('GET', '/articles/')
assert r['status'] == 200 and r['data'] == []
Create via router
router = SimpleRouter()
router.register('articles', ArticleViewSet())
r = router.resolve('POST', '/articles/', data={'title': 'Hello'})
assert r['status'] == 201 and r['data']['title'] == 'Hello'
Retrieve via router
router = SimpleRouter()
vs = ArticleViewSet()
router.register('articles', vs)
vs.create({'title': 'Test'})
r = router.resolve('GET', '/articles/1/')
assert r['status'] == 200 and r['data']['title'] == 'Test'
Route inconnue
router = SimpleRouter()
router.register('articles', ArticleViewSet())
r = router.resolve('GET', '/unknown/')
assert r['status'] == 404

+ 0 tests cachés

Indices (3 disponibles)

solution.py