Routage Django

En termes simples, le routage consiste à déterminer le gestionnaire correspondant en fonction du lien URL demandé par l'utilisateur, et à renvoyer le résultat du traitement, c'est-à-dire à établir une relation de mappage entre l'URL et les vues Django.

Les routes Django sont configurées dans urls.py, et chaque entrée dans urls.py correspond à une méthode de traitement correspondante.

Les différentes versions de Django ont des configurations urls.py légèrement différentes :

Version Django 1.1.x

méthode url(): Les chemins normaux et les chemins regex peuvent être utilisés ; vous devez ajouter manuellement les symboles d'ancrage de début/fin de regex.

Exemple

from django.conf.urls import url # Pour utiliser url, importez-le

url = [
    url(r'^admin/$', admin.site.urls),
    url(r'^index/$', views.index), # Chemin normal
    url(r'^articles/([0-9]{4})/$', views.articles), # Chemin regex
]

Versions après Django 2.2.x

  • path : Utilisé pour les chemins normaux ; pas besoin d'ajouter manuellement les symboles d'ancrage de début/fin de regex car ils sont déjà ajoutés au niveau sous-jacent.
  • re_path : Utilisé pour les chemins regex ; vous devez ajouter manuellement les symboles d'ancrage de début/fin de regex.

Exemple

from django.urls import re_path # Il faut importer re_path
url = [
    path('admin/', admin.site.urls),
    path('index/', views.index), # Chemin normal
    re_path(r'^articles/([0-9]{4})/$', views.articles), # Chemin regex
]

Résumé :L'utilisation de `url` dans Django 1.1.x et `re_path` dans Django 2.2.x est la même.


Groupement dans les chemins d'expressions régulières

Groupes non nommés dans les chemins d'expressions régulières

Les groupes non nommés transmettent les paramètres par position, correspondant un à un.

Dans les vues, en plus de request, le nombre d'autres paramètres doit correspondre au nombre de groupes dans les urls.

urls.py

url = [
    path('admin/', admin.site.urls),
    re_path("^index/([0-9]{4})/$", views.index),
]

views.py

from django.shortcuts import HttpResponse

def index(request, year):
    print(year) # Un paramètre formel représente le contenu d'un groupe dans le chemin, mis en correspondance dans l'ordre.
    return HttpResponse('Rookie Tutorial')

Groupes nommés dans les chemins d'expressions régulières

Syntaxe :

(?P<组名>正则表达式)

Les groupes nommés transmettent les paramètres par mot-clé, indépendamment de l'ordre positionnel.

Dans les vues, en plus de request, le nombre des autres paramètres doit correspondre au nombre de groupes dans urls, et les noms des paramètres dans les vues doivent correspondre aux noms des groupes dans urls.

urls.py

url = [
    path('admin/', admin.site.urls),
    re_path("^index/(?P[0-9]{4})/(?P[0-9]{2})/$", views.index),
]

views.py

from django.shortcuts import HttpResponse
def index(request, year, month):
    print(year,month) # Un paramètre formel représente le contenu d’un groupe dans le chemin, mis en correspondance par mot-clé.
    return HttpResponse('Rookie Tutorial')

Groupes nommés dans les chemins d'expressions régulières

Distribution des routes (include)

Il y a un problème: Dans un projet Django, plusieurs répertoires d’application partageant un seul urls peuvent facilement prêter à confusion, et la maintenance ultérieure est peu pratique.

Solution: Utilisez la distribution des routes (include) afin que chaque répertoire d’application ait ses propres urls de manière indépendante.

Étapes:

  • 1. Créez un fichier urls.py dans chaque répertoire d’application.
  • 2. Dans le fichier urls du répertoire portant le nom du projet, répartissez uniformément les chemins vers chaque répertoire d’application.

Exemple

from django.contrib import admin
from django.urls import path,include # Importer include depuis django.urls
url = [
    path('admin/', admin.site.urls),
    path("app01/", include("app01.urls")),
    path("app02/", include("app02.urls")),
]

Dans chaque répertoire d'application, écrivez votre propre fichier urls.py pour le routage des chemins.

répertoire app01 :

from django.urls import path,re_path 
from app01 import views # 从自己的 app 目录引入 views 
urlpatterns = [ 
    re_path(r'^login/(?P<m>[0-9]{2})/$', views.index, ),
] 

répertoire app02 :

from django.urls import path,re_path
from app02 import views # 从自己的 app 目录引入views 
urlpatterns = [ 
    re_path("^xxx/(?P[0-9]{4})/$", views.xxx), 
]

Écrivez les fonctions de vue respectives dans le fichier views.py sous chaque répertoire d'application.


Résolution inverse

À mesure que les fonctionnalités augmentent, lorsque les URL de la couche de routage changent, vous devez modifier les URL correspondantes dans la couche de vue et la couche de gabarit, ce qui est très fastidieux et peu pratique à maintenir.

À ce stade, nous pouvons utiliser la résolution inverse. Lorsque l'URL de la couche de routage change, l'URL modifiée peut être résolue dynamiquement en sens inverse dans la couche de vue et la couche de gabarit, ce qui évite d'avoir à la modifier.

La résolution inverse est généralement utilisée dans les hyperliens des gabarits et les redirections dans les vues.

Chemin normal

Dans urls.py, donnez un alias à la route,name="route alias"。

path("login1/", views.login, name="login")

Dans views.py, importez reverse depuis django.urls et utilisezreverse("route alias")Résolution inverse :

return redirect(reverse("login"))

Dans les fichiers HTML sous templates, utilisez{% url "route alias" %}Résolution inverse.

<form action="{% url 'login' %}" method="post"> 

Chemin d'expression régulière (groupes non nommés)

Dans urls.py, donnez un alias à la route,name="route alias"。

re_path(r"^login/([0-9]{2})/$", views.login, name="login")

Dans views.py, importez reverse depuis django.urls et utilisezreverse("route alias", args=(parameters matching the regex,))Résolution inverse.

return redirect(reverse("login",args=(10,)))

Dans les fichiers HTML sous templates, utilisez{% url "route alias" parameters matching the regex %}Résolution inverse.

<form action="{% url 'login' 10 %}" method="post"> 

Chemin d'expression régulière (groupes nommés)

Dans urls.py, donnez un alias à la route,name="route alias"。

re_path(r"^login/(?P<year>[0-9]{4})/$", views.login, name="login")

Dans views.py, importez reverse depuis django.urls et utilisezreverse("route alias", kwargs={"group name": parameters matching the regex})Résolution inverse.

return redirect(reverse("login",kwargs={"year":3333}))

Dans les fichiers HTML sous templates, utilisez{% url "route alias" group name=parameters matching the regex %}Résolution inverse.

<form action="{% url 'login' year=3333 %}" method="post">


namespace

Un espace de noms (en anglais : Namespace) représente la portée visible d'un identifiant.

Un identifiant peut être défini dans plusieurs espaces de noms, et ses significations dans différents espaces de noms n'ont aucun lien entre elles.

Tout identifiant peut être défini dans un nouvel espace de noms, et il n'entrera en conflit avec aucun identifiant en double, car les définitions en double se trouvent dans d'autres espaces de noms.

Problèmes existants :Le nom d'alias de route n'a pas de portée. Lorsque Django effectue une résolution inverse de l'URL, il recherche séquentiellement dans tout le projet et renvoie immédiatement lorsqu'il trouve la première URL spécifiée par le nom d'alias de route. Lorsque le même nom d'alias de route est défini dans des urls sous différents répertoires d'application, cela peut provoquer des erreurs de résolution inverse.

Solution :Utilisez des espaces de noms.

Chemin normal

Définissez l'espace de noms (à l'intérieur de include se trouve un tuple) avec le format suivant :
include(("app名称:urls","app名称"))

Exemple :

path("app01/", include(("app01.urls","app01"))) 
path("app02/", include(("app02.urls","app02")))

Dans app01/urls.py, définissez le même alias de route.

path("login/", views.login, name="login")

Utilisez l'espace de noms dans views.py ; le format de syntaxe est le suivant :

reverse("app名称:路由别名")

Exemple :

return redirect(reverse("app01:login")

Utilisez l'espace de noms dans les fichiers HTML sous templates ; le format de syntaxe est le suivant :

{% url "app名称:路由别名" %}

Exemple :

<form action="{% url 'app01:login' %}" method="post">

autres extensions