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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow