Django URL映射

現在,我們有一個工作視圖在前面的章節中解釋。我們希望通過一個URL來訪問該視圖。 Django有他自己 URL映射的方式,現在我們來編輯項目中的 url.py 文件(myproject/url.py)完成。url.py 文件內容看起來如下:

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 之前)。
Django

它是如何做的呢?


我們需要使用下面的代碼來創建一個 urls.py 文件在 myapp 文件夾中(myapp/urls.py) −

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

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

myproject/urls.py 將變更爲以下-

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>
  </style>
</head>
    <body>
        <h2>Welcome to Yiibai .</h2>
        <p>This is my first Django App</p>
    <body>
</html>

注:如果出錯找不到視圖文件請參考:http://www.zhihu.com/question/36065560
Django

現在讓我們想象一下在 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 元組的第一個元素。當你想改變應用程序的名稱時,這非常有用。
Django

發送參數到視圖

現在我們知道如何映射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視圖,在瀏覽器中,應該得到以下結果 -
Django

注意,參數的順序這裏是很重要的。假設我們希望查看一年中某個一個月的文章列表,現在添加一個 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'),)

現在,當您訪問 「 https://asset.1ju.org/myapp/articles/12/2015/」,會得到'Displaying articles of: 2015/12' ,但如果轉換參數,將不能得到相同的結果。
Django

爲避免這種情況,有可能一個URL參數會鏈接到視圖參數。因此 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'),
   url(r'^articles/(?P\\d{2})/(?P\\d{4})', 'viewArticles', name = 'articles'),)