L’emplacement du fichier contenant les URLs racines est spécifié dans la variable ROOT_URLCONF
dans les configurations.
Ici, il s’agira du fichier urls.py, dans le même répertoire que manage.py
ROOT_URLCONF = 'urls'
Le fichier urls doit définir une variable urlpatterns
qui est une liste d’endpoint.
À l’intérieur de cette liste on peut spécifier
un endpoint en passant en paramètres de la fonction path
l’URL et la vue associée.
On peut créer une vue d’une classe qui hérite de django.views.generic.base.View
avec la méthode de classe as_view
Et on peut créer une vue à partir d’un template en utilisant la classe TemplateView
un sous-ensemble d’endpoint avec en paramètre l’URL et un include
d’un autre fichier urls
un endpoint en passant en paramètres de la fonction re_path
le motif de URL et la vue associée (cf section paramètres ci-dessous).
Note: url
est un alias de re_path
urls.py:
"""core URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.apps import apps
from django.conf import settings
from django.contrib.auth import views as auth_views
from django.urls import include, path, re_path
from django.views.generic import TemplateView
from core import views
# namespace is the prefix of the routes name (ie api:user-auth-user)
# include gives the path of the url file + project app to load (should be included in INSTALLED_APPS)
urlpatterns = [
path('about/', views.about, name='about'),
path('accounts/login/', auth_views.LoginView.as_view(), name='login'),
path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'),
path('home/', TemplateView.as_view(template_name='home.html'), name='home'),
path('healthcheck/', include('core.healthchecks.urls'), namespace='healthcheck'),
path('posts/', views.posts, name='posts-index'),
]
# Include only if application is listed in INSTALLED_APPS
if apps.is_installed('api'):
urlpatterns.append(
path('api/', include(('api.urls', 'api'), namespace='api')),
)
Pour définir des paramètres, on peut soit
utiliser path
et indiquer entre chevrons: le type de données, le séparateur deux-point (:) et le nom de la variable à assigner.
Par exemple users/<int:id>/
utiliser re_path
(ou url
) et spécifier une regex
Par exemple r'^users/(?P<pk>[0-9]+)/$'
urlpatterns = [
path('posts/<int:record_id>', views.posts, name='posts-detail'),
re_path(
r'(?P<uidb64>[0-9A-Za-z]+)/(?P<token>.+)/',
views.password_reset_confirm,
name='password-reset-confirm',
),
path(
"<page_slug>-<page_id>/",
include(
[
path("history/", views.history),
path("edit/", views.edit),
path("discuss/", views.discuss),
path("permissions/", views.permissions),
]
),
),
]
Il est possible d’ajouter des types personnalisés: Path converters & Registering custom path converters¶
from django.urls import path
from datetime import date, datetime
from myapp.views import post_detail, post_archive
class DateConverter:
regex = r"\d{4}-\d{1,2}-\d{1,2}"
format = "%Y-%m-%d"
def to_python(self, value: str) -> date:
return datetime.strptime(value, self.format).date()
def to_url(self, value: date) -> str:
return value.strftime(self.format)
register_converter(DateConverter, "date")
urlpatterns = [
path('posts/<int:post_id>/', post_detail, name="post_detail"),
path('posts/archive/<date:archive_date>/', post_archive, name="post_archive"),
]
Les endpoints définis auront un nom associé.
Ils sont précédés de l’espace nom suivit de ‘:’. Par exemple ‘admin:index’ désigne l’espace de nom ‘admin’ et l’URL nommée ‘index’.
On peut créer une URL à partir de son nom avec la fonction django.urls.reverse
from django.urls import reverse
reverse('api:file-list')
reverse('api:file-detail', args=(scanner_id))
Pour lister les endpoints que Django connaît (et leur nom)
Installer le package django-extensions
$ pip install django-extensions
L’ajouter à liste des applications activées (variable INSTALLED_APPS
dans les configurations)
try:
# flake8: noqa
import django_extensions
INSTALLED_APPS += (
'django_extensions',
)
except ModuleNotFoundError:
pass
Utiliser la commande Django show_urls
$ python manage.py show_urls