Django
URL-routering
Zoeken…
Hoe Django een verzoek behandelt
Django verwerkt een verzoek door het inkomende URL-pad naar een weergavefunctie te routeren. De view-functie is verantwoordelijk voor het retourneren van een antwoord aan de klant die het verzoek indient. Verschillende URL's worden meestal afgehandeld door verschillende weergavefuncties. Om het verzoek naar een specifieke weergavefunctie te routeren, kijkt Django naar uw URL-configuratie (of kortweg URLconf). De standaard projectsjabloon definieert de URLconf in <myproject>/urls.py
.
Uw URLconf moet een python-module zijn die een kenmerk definieert met de naam urlpatterns
, wat een lijst is met django.conf.urls.url()
instanties. Elke instantie url()
moet minimaal een reguliere expressie (een regex) definiëren om te matchen met de URL, en een doel, dat ofwel een viewfunctie of een andere URLconf is. Als een URL-patroon een weergavefunctie target, is het een goed idee om het een naam te geven om later gemakkelijk naar het patroon te verwijzen.
Laten we een basisvoorbeeld bekijken:
# 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'),
]
Deze URLconf definieert drie URL-patronen, allemaal gericht op een weergave: home
, about
en blog-detail
.
-
url(r'^$', home, name='home'),
De regex bevat een startanker '^', onmiddellijk gevolgd door een eindanker '$'. Dit patroon zal verzoeken te identificeren, waar het URL-pad is een lege string, opvangen en naar het home
uitzicht gedefinieerd in myapp.views
.
-
url(r'^about/$', about, name='about'),
Deze regex bevat een startanker, gevolgd door de letterlijke tekenreeks about/
en het eindanker. Dit komt overeen met de URL /about/
en leidt deze naar de about
weergave. Aangezien elke niet-lege URL begint met een /
, snijdt Django gemakkelijk de eerste schuine streep voor u uit.
-
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
Deze regex is een beetje complexer. Het definieert het startanker en de letterlijke tekenreeksblog blog/
, zoals het vorige patroon. Het volgende deel (?P<id>\d+)
wordt een vastleggroep genoemd. Een vastleggroep, zoals de naam al doet vermoeden, vangt een deel van de tekenreeks en Django geeft de vastgelegde tekenreeks door als argument aan de weergavefunctie.
De syntaxis van een vastleggroep is (?P<name>pattern)
. name
definieert de naam van de groep. Dit is ook de naam die Django gebruikt om het argument door te geven aan de weergave. Het patroon definieert welke tekens overeenkomen met de groep.
In dit geval is de naam id
, dus de functie blog_detail
moet een parameter met de naam id
accepteren. Het patroon is \d+
. \d
geeft aan dat het patroon alleen overeenkomt met cijfertekens. +
betekent dat het patroon moet overeenkomen met een of meer tekens.
Enkele veel voorkomende patronen:
Patroon | Gebruikt voor | Wedstrijden |
---|---|---|
\d+ | ID kaart | Een of meer numerieke tekens |
[\w-]+ | naaktslak | Een of meer alfanumerieke tekens, onderstrepingstekens of streepjes |
[0-9]{4} | jaar (lang) | Vier getallen, nul tot en met negen |
[0-9]{2} | jaar (kort) maand dag van de maand | Twee getallen, nul tot en met negen |
[^/]+ | pad segment | Alles behalve een schuine streep |
De vastleggroep in het blog-detail
wordt gevolgd door een letterlijke /
en het eindanker.
Geldige URL's zijn onder meer:
-
/blog/1/ # passes id='1'
-
/blog/42/ # passes id='42'
Ongeldige URL's zijn bijvoorbeeld:
-
/blog/a/ # 'a' does not match '\d'
-
/blog// # no characters in the capturing group does not match '+'
Django verwerkt elk URL-patroon in dezelfde volgorde waarin ze zijn gedefinieerd in urlpatterns
. Dit is belangrijk als meerdere patronen met dezelfde URL kunnen overeenkomen. Bijvoorbeeld:
urlpatterns = [
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
url(r'blog/overview/$', blog_overview, name='blog-overview'),
]
In de bovenstaande URLconf is het tweede patroon niet bereikbaar. Het patroon zou overeenkomen met de URL /blog/overview/
, maar in plaats van de weergave blog_overview
aan te roepen, zal de URL eerst overeenkomen met het patroon van de blog-detail
en de blog_detail
weergave oproepen met een argument slug='overview'
.
Om ervoor te zorgen dat de URL /blog/overview/
wordt omgeleid naar de blog_overview
uitzicht, het patroon moet boven de worden gezet blog-detail
patroon:
urlpatterns = [
url(r'blog/overview/$', blog_overview, name='blog-overview'),
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]
Stel de URL-naamruimte in voor een herbruikbare app (Django 1.9+)
Configureer de URL van uw app om automatisch een URL-naamruimte te gebruiken door het kenmerk 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'),
]
Hiermee wordt de toepassingsnaamruimte ingesteld op 'myapp'
wanneer deze is opgenomen in de root URLconf>. De gebruiker van uw herbruikbare app hoeft geen andere configuratie uit te voeren dan uw URL's:
# In <myproject>/urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^myapp/', include('myapp.urls')),
]
Uw herbruikbare app kan nu URL's omkeren met de naamruimte van de app:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
De root URLconf kan nog steeds een instantienaamruimte instellen met de parameter namespace
:
# In <myproject>/urls.py
urlpatterns = [
url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]
Zowel de naamruimte van de toepassing als de naamruimte van de instantie kunnen worden gebruikt om de URL's om te keren:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'
De instantienaamruimte van het exemplaar is standaard de naamruimte van de toepassing als deze niet expliciet is ingesteld.