Recherche…


Comment Django gère une requête

Django gère une requête en acheminant le chemin d’URL entrant vers une fonction de vue. La fonction de visualisation est chargée de renvoyer une réponse au client effectuant la demande. Différentes URL sont généralement traitées par différentes fonctions d'affichage. Pour acheminer la requête vers une fonction de vue spécifique, Django examine votre configuration d'URL (ou URLconf en abrégé). Le modèle de projet par défaut définit l'URLconf dans <myproject>/urls.py .

Votre URLconf devrait être un module python qui définit un attribut nommé urlpatterns , qui est une liste d' django.conf.urls.url() de django.conf.urls.url() . Chaque instance url() doit au minimum définir une expression régulière (une regex) à faire correspondre à l'URL et à une cible, qui est soit une fonction de vue, soit un URLconf différent. Si un modèle d'URL cible une fonction de vue, il est judicieux de lui attribuer un nom afin de pouvoir facilement s'y référer ultérieurement.

Jetons un coup d'oeil à un exemple de base:

# In <myproject>/urls.py

from django.conf.urls import url

from myapp.views import home, about, blog_detail

urlpatterns = [
    url(r'^$', home, name='home'),
    url(r'^about/$', about, name='about'),
    url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
]

Cet URLconf définit trois modèles d'URL, tous ciblant une vue: home , about et blog-detail .

  • url(r'^$', home, name='home'),

Le regex contient une ancre de début '^', immédiatement suivie d'une ancre de fin '$'. Ce modèle correspondra aux demandes pour lesquelles le chemin de l'URL est une chaîne vide et les achemine vers la vue d' home définie dans myapp.views .

  • url(r'^about/$', about, name='about'),

Cette expression régulière contient une ancre de début, suivie de la chaîne littérale à about/ et de l'ancre de fin. Cela correspondra à l'URL /about/ et l'acheminera vers la vue à about . Puisque chaque URL non vide commence par un / , Django coupe commodément la première barre oblique pour vous.

  • url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),

Cette regex est un peu plus complexe. Il définit l’ancre de départ et la chaîne littérale blog/ , comme le modèle précédent. La partie suivante, (?P<id>\d+) , s'appelle un groupe de capture. Un groupe de capture, comme son nom l'indique, capture une partie de la chaîne et Django transmet la chaîne capturée en tant qu'argument à la fonction de vue.

La syntaxe d'un groupe de capture est la suivante: (?P<name>pattern) . name définit le nom du groupe, qui est également le nom que Django utilise pour transmettre l'argument à la vue. Le modèle définit les caractères qui correspondent au groupe.

Dans ce cas, le nom est id , donc la fonction blog_detail doit accepter un paramètre nommé id . Le motif est \d+ . \d signifie que le motif ne correspond qu'aux caractères numériques. + signifie que le motif doit correspondre à un ou plusieurs caractères.

Quelques modèles communs:

Modèle Utilisé pour Allumettes
\d+ id Un ou plusieurs caractères numériques
[\w-]+ limace Un ou plusieurs caractères alphanumériques, traits de soulignement ou tirets
[0-9]{4} année (long) Quatre chiffres, zéro à neuf
[0-9]{2} année courte
mois
jour du mois
Deux chiffres, zéro à neuf
[^/]+ segment de trajectoire Tout sauf une barre oblique

Le groupe de capture dans le modèle de blog-detail est suivi d'un littéral / et de l'ancre de fin.

Les URL valides incluent:

  • /blog/1/ # passes id='1'
  • /blog/42/ # passes id='42'

Les URL non valides sont par exemple:

  • /blog/a/ # 'a' does not match '\d'
  • /blog// # no characters in the capturing group does not match '+'

Django traite chaque modèle d’URL dans le même ordre qu’ils sont définis dans urlpatterns . Ceci est important si plusieurs modèles peuvent correspondre à la même URL. Par exemple:

urlpatterns = [
    url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
    url(r'blog/overview/$', blog_overview, name='blog-overview'),
]

Dans le URLconf ci-dessus, le deuxième modèle n'est pas accessible. Le modèle correspond à l'URL /blog/overview/ , mais au lieu d'appeler la vue blog_overview , l'URL correspondra d'abord au modèle de blog-detail du blog-detail et appellera la vue blog_detail avec un argument slug='overview' .

Pour vous assurer que l'URL /blog/overview/ est routé vers la vue blog_overview , le modèle doit être placé au-dessus du modèle de blog-detail du blog-detail :

urlpatterns = [
    url(r'blog/overview/$', blog_overview, name='blog-overview'),
    url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]

Définir l'espace de noms URL pour une application réutilisable (Django 1.9+)

Configurez l'URLconf de votre application pour utiliser automatiquement un espace de noms URL en définissant l'attribut app_name :

# In <myapp>/urls.py
from django.conf.urls import url

from .views import overview

app_name = 'myapp'
urlpatterns = [
    url(r'^$', overview, name='overview'),
]

Cela définira l' espace de noms de l' application sur 'myapp' lorsqu'il est inclus dans l'URLconf racine>. L'utilisateur de votre application réutilisable n'a pas besoin d'effectuer de configuration autre que l'inclusion de vos URL:

# In <myproject>/urls.py
from django.conf.urls import include, url

urlpatterns = [
    url(r'^myapp/', include('myapp.urls')),
]

Votre application réutilisable peut maintenant inverser les URL à l'aide de l'espace de noms de l'application:

>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'

La URLconf racine peut toujours définir un espace de noms d'instance avec le paramètre namespace :

# In <myproject>/urls.py
urlpatterns = [
    url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]

L'espace de noms de l'application et l'espace de noms de l'instance peuvent être utilisés pour inverser les URL:

>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'

L'espace de noms de l'instance utilise par défaut l'espace de noms de l'application s'il n'est pas défini explicitement.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow