Django - mapowanie adresów URL

Teraz, gdy mamy widok roboczy, jak wyjaśniono w poprzednich rozdziałach. Chcemy uzyskać dostęp do tego widoku za pośrednictwem adresu URL. Django ma swój własny sposób mapowania adresów URL i odbywa się to poprzez edycję pliku url.py projektu(myproject/url.py). Plik url.py wygląda następująco -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

Gdy użytkownik wysyła żądanie dotyczące strony w Twojej aplikacji internetowej, kontroler Django przejmuje kontrolę nad szukaniem odpowiedniego widoku za pośrednictwem pliku url.py, a następnie zwraca odpowiedź HTML lub błąd 404 not found, jeśli nie zostanie znaleziony. W url.py najważniejszy jest plik"urlpatterns"krotka. Tutaj definiujesz mapowanie między adresami URL a widokami. Mapowanie to krotka we wzorcach adresów URL, takich jak -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

Zaznaczona linia odwzorowuje adres URL „/ home” na widok hello utworzony w pliku myapp / view.py. Jak widać powyżej, mapowanie składa się z trzech elementów -

  • The pattern- wyrażenie regularne pasujące do adresu URL, który ma zostać rozwiązany i zmapowany. Wszystko, co może współpracować z modułem 're' języka Python, kwalifikuje się do wzorca (przydatne, gdy chcesz przekazywać parametry przez adres url).

  • The python path to the view - To samo, co podczas importowania modułu.

  • The name- Aby wykonać odwrócenie adresów URL, należy użyć nazwanych wzorców adresów URL, tak jak w przykładach powyżej. Po zakończeniu wystarczy uruchomić serwer, aby uzyskać dostęp do widoku przez: http: //127.0.0.1/hello

Organizowanie adresów URL

Do tej pory utworzyliśmy adresy URL w pliku „myprojects / url.py”, jednak jak wspomniano wcześniej o Django i tworzeniu aplikacji, najlepszym punktem była możliwość ponownego wykorzystania aplikacji w różnych projektach. Możesz łatwo zobaczyć, na czym polega problem, jeśli zapisujesz wszystkie adresy URL w pliku „projecturl.py”. Dlatego najlepszą praktyką jest utworzenie „url.py” dla każdej aplikacji i umieszczenie go w pliku url.py naszych głównych projektów (wcześniej dołączaliśmy adresy URL interfejsu administratora).

Jak to jest zrobione?

Musimy utworzyć plik url.py w myapp przy użyciu następującego kodu -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

Następnie myproject / url.py zmieni się w następujący -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include('myapp.urls')),
)

Dołączyliśmy wszystkie adresy URL z aplikacji myapp. Plik home.html, do którego uzyskano dostęp przez „/ hello”, to teraz „/ myapp / hello”, co jest lepszą i bardziej zrozumiałą strukturą dla aplikacji internetowej.

Teraz wyobraźmy sobie, że mamy inny widok w „rano” myapp i chcemy go zmapować w myapp / url.py, wtedy zmienimy naszą myapp / url.py na -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

Można to ponownie rozłożyć na -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

Jak widać, używamy teraz pierwszego elementu naszego urlpatternskrotka. Może to być przydatne, gdy chcesz zmienić nazwę aplikacji.

Wysyłanie parametrów do widoków

Teraz wiemy, jak mapować adresy URL, jak je organizować, teraz zobaczmy, jak przesyłać parametry do widoków. Klasycznym przykładem jest przykład artykułu (chcesz uzyskać dostęp do artykułu za pośrednictwem „/ article / article_id”).

Przekazywanie parametrów odbywa się poprzez przechwytywanie ich za pomocą regexpwe wzorcu adresu URL. Jeśli mamy widok podobny do poniższego w „myapp / view.py”

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

Chcemy zmapować go w myapp / url.py, abyśmy mogli uzyskać do niego dostęp przez „/ myapp / article / articleId”, potrzebujemy następującego w „myapp / url.py” -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

Kiedy Django zobaczy adres url: „/ myapp / article / 42”, przekaże parametry '42' do widoku viewArticle, a w przeglądarce powinien pojawić się następujący wynik -

Zwróć uwagę, że kolejność parametrów jest tutaj ważna. Załóżmy, że chcemy listę artykułów z miesiąca lub roku, dodajmy widok ViewArticles. Nasz plik view.py staje się -

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Odpowiedni url.py plik będzie wyglądał następująco -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

Teraz, kiedy przejdziesz do „/ myapp / Articles / 12/2006 /”, zobaczysz „Wyświetlanie artykułów z: 2006/12”, ale jeśli zmienisz parametry, nie uzyskasz tego samego wyniku.

Aby tego uniknąć, można połączyć parametr adresu URL z parametrem widoku. W tym celu naszurl.py stanie się -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)