Django - URL-Zuordnung
Jetzt haben wir eine Arbeitsansicht, wie in den vorherigen Kapiteln erläutert. Wir möchten über eine URL auf diese Ansicht zugreifen. Django hat seine eigene Methode für die URL-Zuordnung und dies erfolgt durch Bearbeiten Ihrer Projekt-URL-Datei(myproject/url.py). Die url.py-Datei sieht aus wie -
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)),
)
Wenn ein Benutzer eine Seite in Ihrer Web-App anfordert, übernimmt der Django-Controller die Suche nach der entsprechenden Ansicht über die Datei url.py und gibt dann die HTML-Antwort oder einen Fehler 404 nicht gefunden zurück, falls nicht gefunden. In url.py ist das Wichtigste das"urlpatterns"Tupel. Hier definieren Sie die Zuordnung zwischen URLs und Ansichten. Ein Mapping ist ein Tupel in URL-Mustern wie -
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'),
)
Die markierte Zeile ordnet die URL "/ home" der in der Datei myapp / view.py erstellten Hallo-Ansicht zu. Wie Sie oben sehen können, besteht ein Mapping aus drei Elementen:
The pattern- Ein regulärer Ausdruck, der mit der URL übereinstimmt, die aufgelöst und zugeordnet werden soll. Alles, was mit dem Python 're'-Modul funktionieren kann, ist für das Muster geeignet (nützlich, wenn Sie Parameter per URL übergeben möchten).
The python path to the view - Wie beim Importieren eines Moduls.
The name- Um eine URL-Umkehrung durchzuführen, müssen Sie benannte URL-Muster verwenden, wie in den obigen Beispielen beschrieben. Sobald Sie fertig sind, starten Sie einfach den Server, um auf Ihre Ansicht zuzugreifen über: http: //127.0.0.1/hello
Organisieren Sie Ihre URLs
Bisher haben wir die URLs in der Datei "myprojects / url.py" erstellt. Wie bereits erwähnt, war es jedoch das Beste, Anwendungen in verschiedenen Projekten wiederverwenden zu können. Sie können das Problem leicht erkennen, wenn Sie alle Ihre URLs in der Datei "projecturl.py" speichern. Daher empfiehlt es sich, pro Anwendung eine „url.py“ zu erstellen und diese in die URL.py-Datei unseres Hauptprojekts aufzunehmen (wir haben zuvor Admin-URLs für die Admin-Oberfläche eingefügt).
Wie wird es gemacht?
Wir müssen eine url.py-Datei in myapp mit dem folgenden Code erstellen:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)
Dann ändert sich myproject / url.py wie folgt:
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')),
)
Wir haben alle URLs aus der myapp-Anwendung aufgenommen. Die home.html, auf die über "/ hello" zugegriffen wurde, ist jetzt "/ myapp / hello". Dies ist eine bessere und verständlichere Struktur für die Web-App.
Stellen wir uns nun vor, wir haben eine andere Ansicht in myapp "Morgen" und wir möchten sie in myapp / url.py zuordnen. Dann ändern wir unsere myapp / url.py in -
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'),
)
Dies kann umgerechnet werden, um -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),)
Wie Sie sehen können, verwenden wir jetzt das erste Element unserer urlpatternsTupel. Dies kann nützlich sein, wenn Sie Ihren App-Namen ändern möchten.
Senden von Parametern an Ansichten
Wir wissen jetzt, wie man URLs zuordnet, wie man sie organisiert und wie man Parameter an Ansichten sendet. Ein klassisches Beispiel ist das Artikelbeispiel (Sie möchten über „/ articles / article_id“ auf einen Artikel zugreifen).
Das Übergeben von Parametern erfolgt durch Erfassen mit regexpim URL-Muster. Wenn wir eine Ansicht wie die folgende in "myapp / view.py" haben
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)
Wir möchten es in myapp / url.py zuordnen, damit wir über "/ myapp / article / articleId" darauf zugreifen können. Wir benötigen Folgendes in "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'),)
Wenn Django die URL "/ myapp / article / 42" sieht, werden die Parameter '42' an die viewArticle-Ansicht übergeben, und in Ihrem Browser sollten Sie das folgende Ergebnis erhalten:
Beachten Sie, dass hier die Reihenfolge der Parameter wichtig ist. Angenommen, wir möchten die Liste der Artikel eines Monats eines Jahres, dann fügen wir eine viewArticles-Ansicht hinzu. Unsere view.py wird -
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)
Die entsprechende url.py Datei wird aussehen wie -
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'),)
Wenn Sie nun zu "/ myapp / articles / 12/2006 /" gehen, wird "Artikel anzeigen von: 2006/12" angezeigt. Wenn Sie jedoch die Parameter umkehren, erhalten Sie nicht das gleiche Ergebnis.
Um dies zu vermeiden, ist es möglich, einen URL-Parameter mit dem Ansichtsparameter zu verknüpfen. Dafür unsereurl.py wird werden -
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'),)