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)), )
當使用者在您的網路應用程式發起一個網頁的請求,Django控制器會接管通過url.py檔案來尋找相應的檢視,然後返回HTML響應或如果沒有找到則返回404未找到錯誤。最重要的是「urlpatterns」 元組。這就是定義URL和檢視之間的對映。一個對映的URL模式就像一個元組 ?
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'), )
標記行對映URL "/home" 到 myapp/ view.py檔案中建立的Hello檢視。正如你看到上面的對映是由三個要素 -
模式? 一個正規表示式匹配以URL予以解決和對映。 能夠與python 「re」模組工作一切都符合的模式(非常有用在你想通過URL來傳遞引數時)。
python到檢視的路徑?在你匯入模組時相同。
名稱?為了執行URL反轉,需要使用URL模式的命名來執行上面範例。這樣做以後,啟動伺服器,通過以下URL存取您的檢視:http://127.0.0.1/hello
到目前為止,我們已經建立了「myprojects/url.py」檔案的URL,然而,正如前面關於Django說明,建立一個應用程式,最好是能夠重複使用在不同的專案中應用。 這樣就可以很容易地看到的問題是什麼,如果要儲存所有網址中在「projecturl.py」檔案中。 所以,最好的做法是建立每個應用程式的「url.py」,並把它列入我們的主專案 url.py 檔案(包括在我們的管理介面管理的 URL 之前)。
我們需要使用下面的程式碼來建立一個 urls.py 檔案在 myapp 檔案夾中(myapp/urls.py) ?
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)
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)), )
我們已經包括了 myapp 應用程式的所有URL。這是通過存取 home.html 為 「/hello」,現在是 「/myapp/hello」 ,這是 Web應用程式的更好和更容易理解的結構。
再建立一個檢視檔案:C:\myproject\templates\myapp\hello.html,其內容如下:
<html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Hello </title> <meta name="robots" content="NONE,NOARCHIVE"> </style> </head> <body> <h2>Welcome to Yiibai .</h2> <p>This is my first Django App</p> <body> </html>
註:如果出錯找不到檢視檔案請參考:http://www.zhihu.com/question/36065560
現在讓我們想象一下在 myapp 的 「morning」 的另一個檢視,我們希望它在對映myapp/url.py,we will then change our myapp/url.py to ?
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'), )
這可以被重構為 ?
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'),)
正如你所看到的,我們現在使用 urlpatterns 元組的第一個元素。當你想改變應用程式的名稱時,這非常有用。
現在我們知道如何對映URL,如何組織他們,現在就讓我們來看看如何將引數傳遞給檢視。一個經典的文章例子(您要存取文章到「/articles/article_id」)。
傳遞引數是通過URL模式正規表示式捕捉它們完成的。如果我們有類似以下的檢視 「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)
我們想把它對映放在myapp/urls.py ,所以我們可以通過 「/myapp/article/articleId」 存取, 我們需要在下列 「myapp/urls.py」 定義?
from django.conf.urls import url from . import views urlpatterns = [ url(r'^hello', views.hello, name='hello'), url(r'^article/(\d+)/', views.viewArticle, name = 'article'), url(r'^$', views.index, name='index'), ]
當Django會看到URL: 「/myapp/article/42」 ,它將傳遞引數'42'到viewArticle檢視,在瀏覽器中,應該得到以下結果 -
注意,引數的順序這裡是很重要的。假設我們希望檢視一年中某個一個月的文章列表,現在新增一個 viewArticles 檢視。 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) def viewArticles(request, month, year): text = "Displaying articles of : %s/%s"%(year, month) return HttpResponse(text)
相應的 myapp/urls.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'), url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)
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'),)