Django
Routing adresów URL
Szukaj…
Jak Django obsługuje żądanie
Django obsługuje żądanie, kierując ścieżkę przychodzącego adresu URL do funkcji widoku. Funkcja widoku odpowiada za zwrócenie odpowiedzi klientowi wysyłającemu żądanie. Różne adresy URL są zwykle obsługiwane przez różne funkcje widoku. Aby skierować żądanie do określonej funkcji widoku, Django sprawdza konfigurację adresu URL (lub w skrócie URLconf). Domyślny szablon projektu definiuje URLconf w <myproject>/urls.py
.
Twój URLconf powinien być modułem Pythona, który definiuje atrybut o nazwie urlpatterns
, który jest listą instancji django.conf.urls.url()
. Każda instancja url()
musi co najmniej zdefiniować wyrażenie regularne (regex), aby pasowało do adresu URL, oraz cel, który jest funkcją widoku lub innym plikiem URLconf. Jeśli wzorzec adresu URL jest ukierunkowany na funkcję widoku, dobrym pomysłem jest nadanie mu nazwy w celu późniejszego łatwego odwołania do wzorca.
Spójrzmy na podstawowy przykład:
# 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'),
]
Ten URLconf definiuje trzy wzorce adresów URL, wszystkie ukierunkowane na widok: home
, about
i blog-detail
.
-
url(r'^$', home, name='home'),
Wyrażenie regularne zawiera początkową kotwicę „^”, a następnie bezpośrednio końcową kotwicę „$”. Ten wzór będzie pasował do żądania gdzie ścieżka URL jest pusty ciąg znaków, a trasa ich do home
widzenia zdefiniowanego w myapp.views
.
-
url(r'^about/$', about, name='about'),
Ten wyrażenie regularne zawiera początkową kotwicę, po której następuje dosłowny ciąg znaków about/
i końcowa kotwica. Spowoduje to dopasowanie adresu URL /about/
i skierowanie go do widoku about
. Ponieważ każdy niepusty adres URL zaczyna się od znaku /
, Django wygodnie wycina dla ciebie pierwszy ukośnik.
-
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
Ten wyrażenie regularne jest nieco bardziej złożone. Określa początkową kotwicę i dosłowny ciąg blog/
, podobnie jak poprzedni wzorzec. Kolejna część (?P<id>\d+)
nazywa się grupą przechwytującą. Grupa przechwytująca, jak sama nazwa wskazuje, przechwytuje część ciągu, a Django przekazuje przechwycony ciąg jako argument funkcji widoku.
Składnia grupy przechwytywania jest (?P<name>pattern)
. name
określa nazwę grupy, która jest także nazwą, której Django używa do przekazania argumentu do widoku. Wzór określa, które znaki pasują do grupy.
W tym przypadku nazwa to id
, więc funkcja blog_detail
musi zaakceptować parametr o nazwie id
. Wzór to \d+
. \d
oznacza, że wzorzec pasuje tylko do znaków numerycznych. +
oznacza, że wzorzec musi pasować do jednego lub więcej znaków.
Niektóre typowe wzorce:
Wzór | Używany do | mecze |
---|---|---|
\d+ | ID | Jeden lub więcej znaków numerycznych |
[\w-]+ | ślimak | Jeden lub więcej znaków alfanumerycznych, podkreśleń lub myślników |
[0-9]{4} | rok (długi) | Cztery liczby, od zera do dziewięciu |
[0-9]{2} | rok (krótki) miesiąc dzień miesiąca | Dwie liczby, od zera do dziewięciu |
[^/]+ | segment ścieżki | Wszystko oprócz ukośnika |
Po grupie przechwytywania we wzorze blog-detail
następuje literał /
i kotwica końcowa.
Prawidłowe adresy URL obejmują:
-
/blog/1/ # passes id='1'
-
/blog/42/ # passes id='42'
Nieprawidłowe adresy URL to na przykład:
-
/blog/a/ # 'a' does not match '\d'
-
/blog// # no characters in the capturing group does not match '+'
Django przetwarza każdy wzorzec adresu URL w tej samej kolejności, w jakiej są zdefiniowane w urlpatterns
. Jest to ważne, jeśli wiele wzorców może pasować do tego samego adresu URL. Na przykład:
urlpatterns = [
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
url(r'blog/overview/$', blog_overview, name='blog-overview'),
]
W powyższym URLconf drugi wzorzec nie jest osiągalny. Wzorzec blog_overview
do adresu URL /blog/overview/
blog_overview
/blog/overview/
, ale zamiast wywoływać widok blog_overview
, adres URL najpierw pasuje do wzorca blog-detail
i wywołuje widok blog_detail
z argumentem slug='overview'
blog_detail
slug='overview'
.
Aby upewnić się, że adres URL /blog/overview/
blog_overview
/blog/overview/
jest przekierowany do widoku blog_overview
, wzorzec należy umieścić powyżej wzorca blog-detail
:
urlpatterns = [
url(r'blog/overview/$', blog_overview, name='blog-overview'),
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]
Ustaw przestrzeń nazw URL dla aplikacji wielokrotnego użytku (Django 1.9+)
Skonfiguruj URLconf aplikacji, aby automatycznie używał przestrzeni nazw URL, ustawiając atrybut 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'),
]
Spowoduje to ustawienie przestrzeni nazw aplikacji na 'myapp'
gdy będzie ona zawarta w katalogu głównym URLconf>. Użytkownik aplikacji wielokrotnego użytku nie musi wykonywać żadnej konfiguracji poza podaniem adresów URL:
# In <myproject>/urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^myapp/', include('myapp.urls')),
]
Twoja aplikacja wielokrotnego użytku może teraz odwracać adresy URL za pomocą przestrzeni nazw aplikacji:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
Główny plik URLconf nadal może ustawiać przestrzeń nazw instancji za pomocą parametru namespace
:
# In <myproject>/urls.py
urlpatterns = [
url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]
Zarówno przestrzeń nazw aplikacji, jak i przestrzeń nazw instancji mogą być użyte do odwrócenia adresów URL:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'
Domyślną przestrzenią nazw instancji jest przestrzeń nazw aplikacji, jeśli nie jest jawnie ustawiona.