Le fichier urls.py : routage d'URL avec Django
Le fichier urls.py
Sous Django, chaque projet dispose d'un contrôleur frontal.
Dans le cadre de notre projet miage_scrum
, un fichier urls.py
existe donc par défaut dans le répertoire miage_scrum/miage_scrum/
.
Délégation aux applications
Pour rendre les applications très modulaires et réutilisables, il est possible de faire en sorte que le projet délègue une partie de la gestion des règles d'aiguillages à différentes applications. Ainsi, chaque application est responsable du routage interne des URL la concernant.
Dans le cadre de notre projet, l'ensemble des règles relatives aux backlogs, au dashboard, etc. sera géré par l'application chistera
. Django implémente ceci de manière très élégante, en permettant la création d'un fichier urls.py
dans le répertoire de l'application elle-même, puis en aiguillant un ensemble de requêtes depuis le contrôleur frontal d'un projet vers le contrôleur frontal de l'application.
Voyons à présent de quoi il en retourne concrètement.
Écriture du contrôleur frontal du projet
Commençons par écrire le contrôleur frontal du projet… ou plutôt le compléter, car nous l'avons déjà édité pour activer l'interface d'administration par scaffolding, rappelez-vous !
miage_scrum/miage_scrum/urls.pyfrom django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('chistera.urls', namespace='chistera', app_name='chistera')),
)
Nous avons simplement ajouté une ligne au fichier existant. Cette ligne permet en substance de dire à Django : « Je veux que tu rediriges toutes les requêtes faites à la racine (^
) vers le contrôleur frontal de l'application « chistera » qui est défini dans le module chistera.urls
. Et, temps qu'on y est, je souhaite pouvoir faire référence à ces routes par la suite via un espace de nom qui s'appellera chistera
. »
Il nous reste maintenant à (enfin !) définir nos routes vers les contrôleurs dédiés. Nous allons le faire dans le fichier urls.py
de l'application.
Écriture du contrôleur frontal d'une application
Dans le répertoire de l'application, créons un fichier nommé urls.py
, et écrivons-y nos règles de routage :
from django.conf.urls import patterns, url
urlpatterns = patterns('',
url(r'^dashboard/$', 'chistera.views.dashboard', name='dashboard'),
url(r'^backlog/(?P<backlog_id>[0-9]+)/$', 'chistera.views.backlog', name='backlog'),
)
Comme vous le remarquez, chaque règle de routage est définie selon la syntaxe suivante : url(pattern, contrôleur de destination, nom).
:
- Le pattern est en fait une expression régulière (comme c'est souvent le cas dans les frameworks MVC). Une des force est ici l'utilisation des groupes nommés rendus possibles par Python : par exemple pour
backlog
, nous disons ici que le pattern d'URL contient une variable composée de chiffres, que l'on nomme explicitementbacklog_id
. - Le contrôleur de destination est une fonction définie dans le fichier des contrôleurs (views) de l'application. Nous verrons plus tard de quelle manière les contrôleurs sont écrits. Ce que vous devez savoir maintenant, c'est que la fonction représentant le contrôleur se verra passer en paramètre(s) l'ensemble des variables nommées dans le pattern. Par exemple, pour
backlog
, la fonctionchistera.views.backlog()
recevra un paramètre nommé…backlog_id
. Logique non ? - Le nom de la règle de routage est utilisé pour le routage inverse. Étant donné le contrôleur
chistera.views.dashboard
, il est ainsi possible de retrouver l'URLdashboard/
grâce à la fonctionreverse()
de Django à qui l'on passe le nom de la règle de routage dans son espace de nom :reverse('chistera:dashboard')
retourneradashboard/
. Idéal pour ne jamais hard-coder d'URL et rester DRY !
Routage d'URL : check !
OK, notre contrôleur frontal est en place. Essayons d'accéder à l'une des URL définies pour voir ce qui se passe :
Pas content Django ! Normal, en fait : nous lui avons indiqué une route qui mène à une destination inexistante, ce qui rend le voyage désagréable. Il ne nous reste plus qu'à écrire les contrôleurs adéquats, ce qui sera l'objet du prochain tutoriel.
Testez vos connaissances…
- D'une application.
- D'un contrôleur.
- D'une vue.
- D'un projet.
url(r'^dashboard/$', 'chistera.views.dashboard', name='dashboard')
, à quoi sert le paramètre name
?- Il sert simplement à ajouter de la lisibilité au code, ce qui est important en Python.
- Il sert à nommer l'URL pour pouvoir y faire référence plus tard via
reverse()
.
- Parce qu'on n'a pas le choix.
- On les utilise quand les URLs à traiter comporte une partie variable (un id ou un slug).
- On ne peut pas utiliser d'expression régulière dans un pattern d'URL Django.
- Car le composant de gestion des URLs est défini dans le module Python
re
.