Django
URL-routing
Sök…
Hur Django hanterar en begäran
Django hanterar en begäran genom att dirigera den inkommande URL-sökvägen till en vyfunktion. Visningsfunktionen är ansvarig för att returnera ett svar tillbaka till klienten som begär begäran. Olika webbadresser hanteras vanligtvis av olika visningsfunktioner. För att dirigera begäran till en viss vyfunktion tittar Django på din URL-konfiguration (eller URLconf kort). Standardprojektmallen definierar URLconf i <myproject>/urls.py
.
Din URLconf bör vara en pythonmodul som definierar ett attribut som heter urlpatterns
, som är en lista med django.conf.urls.url()
-instanser. Varje url()
-instans måste minst definiera ett regelbundet uttryck (ett regex) för att matcha mot webbadressen och ett mål, som antingen är en visningsfunktion eller en annan URLconf. Om ett URL-mönster riktar sig till en visningsfunktion är det en bra idé att ge den ett namn för att enkelt referera till mönstret senare.
Låt oss ta en titt på ett grundläggande exempel:
# 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'),
]
Den här URLconf definierar tre URL-mönster, alla riktade mot en vy: home
, about
och blog-detail
.
-
url(r'^$', home, name='home'),
Regexet innehåller ett startankare '^', omedelbart följt av ett slutankare '$'. Detta mönster kommer att matcha förfrågningar där URL vägen är en tom sträng, och dra dem till home
uppfattning som definieras i myapp.views
.
-
url(r'^about/$', about, name='about'),
Denna regex innehåller ett startankare, följt av den bokstavliga strängen about/
och slutankret. Detta kommer att matcha URL /about/
och dra den till about
vyn. Eftersom varje webbadress som inte är tom börjar med en /
, klipper Django bekvämt av det första snedstrecket för dig.
-
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
Denna regex är lite mer komplex. Den definierar startankret och den bokstavliga blog/
, som föregående mönster. Nästa del, (?P<id>\d+)
, kallas en fångargrupp. En fångargrupp fångar, som namnet antyder, en del av strängen, och Django skickar den fångade strängen som ett argument till visningsfunktionen.
Syntaxen för en bildgrupp är (?P<name>pattern)
. name
definierar namnet på gruppen, som också är namnet som Django använder för att skicka argumentet till vyn. Mönstret definierar vilka tecken som matchas av gruppen.
I detta fall är namnet id
, så funktionen blog_detail
måste acceptera en parameter med namnet id
. Mönstret är \d+
. \d
betyder att mönstret bara matchar siffertecken. +
betyder att mönstret måste matcha ett eller flera tecken.
Några vanliga mönster:
Mönster | Används för | Tändstickor |
---|---|---|
\d+ | id | En eller flera numeriska tecken |
[\w-]+ | snigel | Ett eller flera alfanumeriska tecken, understreck eller bindestreck |
[0-9]{4} | år (lång) | Fyra nummer, noll till nio |
[0-9]{2} | år (kort) månad dag i månaden | Två siffror, noll till nio |
[^/]+ | sökvägsegment | Allt utom en snedstreck |
Fångargruppen i blog-detail
följs av en bokstavlig /
och slutankaren.
Giltiga webbadresser inkluderar:
-
/blog/1/ # passes id='1'
-
/blog/42/ # passes id='42'
Ogiltiga webbadresser är till exempel:
-
/blog/a/ # 'a' does not match '\d'
-
/blog// # no characters in the capturing group does not match '+'
Django bearbetar varje URL-mönster i samma ordning som de definieras i urlpatterns
. Detta är viktigt om flera mönster kan matcha samma URL. Till exempel:
urlpatterns = [
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
url(r'blog/overview/$', blog_overview, name='blog-overview'),
]
I ovanstående URLconf kan det andra mönstret inte nås. Mönstret skulle matcha URL /blog/overview/
, men i stället för att ringa blog_overview
anser webbadressen först matcha blog-detail
mönster och kallar blog_detail
vy med ett argument slug='overview'
.
För att vara säker på att webbadressen /blog/overview/
dirigeras till blog_overview
anser mönstret bör sättas ovanför blog-detail
mönster:
urlpatterns = [
url(r'blog/overview/$', blog_overview, name='blog-overview'),
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]
Ställ in URL-namnområdet för en återanvändbar app (Django 1.9+)
Konfigurera appens URLconf för att automatiskt använda ett URL-namnområde genom att ställa in app_name
attributet:
# In <myapp>/urls.py
from django.conf.urls import url
from .views import overview
app_name = 'myapp'
urlpatterns = [
url(r'^$', overview, name='overview'),
]
Detta sätter applikationsnamnområdet till 'myapp'
när det ingår i root URLconf>. Användaren av din återanvändbara app behöver inte göra någon annan konfiguration än att inkludera dina webbadresser:
# In <myproject>/urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^myapp/', include('myapp.urls')),
]
Din återanvändbara app kan nu vända URL: er med applikationsnamnområdet:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
Rot-URLconf kan fortfarande ställa in ett instansnamnområde med namespace
parameter:
# In <myproject>/urls.py
urlpatterns = [
url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]
Både applikationsnamnområdet och instansnamnområdet kan användas för att vända URL: er:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'
Instansnamnsområdet är standard för applikationsnamnområdet om det inte är uttryckligen inställt.