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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow