Django URL映射

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

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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)),
 )  , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
 )

當(dāng)用戶在您的網(wǎng)絡(luò)應(yīng)用程序發(fā)起一個(gè)網(wǎng)頁的請(qǐng)求,Django控制器會(huì)接管通過url.py文件來尋找相應(yīng)的視圖,然后返回HTML響應(yīng)或如果沒有找到則返回404未找到錯(cuò)誤。最重要的是“urlpatterns” 元組。這就是定義URL和視圖之間的映射。一個(gè)映射的URL模式就像一個(gè)元組 ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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'),
 )  , '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'),
 )

標(biāo)記行映射URL "/home" 到 myapp/ view.py文件中創(chuàng)建的Hello視圖。正如你看到上面的映射是由三個(gè)要素 -

模式? 一個(gè)正則表達(dá)式匹配以URL予以解決和映射。 能夠與python “re”模塊工作一切都符合的模式(非常有用在你想通過URL來傳遞參數(shù)時(shí))。 python到視圖的路徑?在你導(dǎo)入模塊時(shí)相同。 名稱?為了執(zhí)行URL反轉(zhuǎn),需要使用URL模式的命名來執(zhí)行上面示例。這樣做以后,啟動(dòng)服務(wù)器,通過以下URL訪問您的視圖:http://127.0.0.1/hello

整理網(wǎng)址

到目前為止,我們已經(jīng)創(chuàng)建了“myprojects/url.py”文件的URL,然而,正如前面關(guān)于Django說明,創(chuàng)建一個(gè)應(yīng)用程序,最好是能夠重復(fù)使用在不同的項(xiàng)目中應(yīng)用。 這樣就可以很容易地看到的問題是什么,如果要保存所有網(wǎng)址中在“projecturl.py”文件中。 所以,最好的做法是創(chuàng)建每個(gè)應(yīng)用程序的“url.py”,并把它列入我們的主項(xiàng)目 url.py 文件(包括在我們的管理界面管理的 URL 之前)。

整理網(wǎng)址

它是如何做的呢?

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

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

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

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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)),
 )  , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
    url(r'^myapp/', include(myapp.urls)),
 )

我們已經(jīng)包括了 myapp 應(yīng)用程序的所有URL。這是通過訪問 home.html 為 “/hello”,現(xiàn)在是 “/myapp/hello” ,這是 Web應(yīng)用程序的更好和更容易理解的結(jié)構(gòu)。

再創(chuàng)建一個(gè)視圖文件:C:\myproject\templates\myapp\hello.html,其內(nèi)容如下:

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
<html>
 <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 Nhooo .</h2>
         <p>This is my first Django App</p>
     <body>
 </html>

現(xiàn)在讓我們想象一下在 myapp 的 “morning” 的另一個(gè)視圖,我們希望它在映射myapp/url.py,we will then change our myapp/url.py to ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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'),
 )

這可以被重構(gòu)為 ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('myapp.views',
    url(r'^hello/', 'hello', name = 'hello'),
    url(r'^morning/', 'morning', name = 'morning'),)

正如你所看到的,我們現(xiàn)在使用 urlpatterns 元組的第一個(gè)元素。當(dāng)你想改變應(yīng)用程序的名稱時(shí),這非常有用。

urlpatterns 元組的第一個(gè)元素

發(fā)送參數(shù)到視圖

現(xiàn)在我們知道如何映射URL,如何組織他們,現(xiàn)在就讓我們來看看如何將參數(shù)傳遞給視圖。一個(gè)經(jīng)典的文章實(shí)例(您要訪問文章到“/articles/article_id”)。

傳遞參數(shù)是通過URL模式正則表達(dá)式捕捉它們完成的。如果我們有類似以下的視圖 “myapp/view.py”

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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” 定義?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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'),
 ] , views.index, name='index'),
 ]


當(dāng)Django會(huì)看到URL: “/myapp/article/42” ,它將傳遞參數(shù)'42'到viewArticle視圖,在瀏覽器中,應(yīng)該得到以下結(jié)果 -

viewArticle視圖

注意,參數(shù)的順序這里是很重要的。假設(shè)我們希望查看一年中某個(gè)一個(gè)月的文章列表,現(xiàn)在添加一個(gè) viewArticles 視圖。 view.py 代碼變?yōu)?nbsp;-

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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)

相應(yīng)的 myapp/urls.py 文件看起來如下 ?

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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'),)

現(xiàn)在,當(dāng)您訪問 http://localhost:8000/myapp/articles/12/2015/,會(huì)得到'Displaying articles of: 2015/12' ,但如果轉(zhuǎn)換參數(shù),將不能得到相同的結(jié)果。

網(wǎng)頁顯示

為避免這種情況,有可能一個(gè)URL參數(shù)會(huì)鏈接到視圖參數(shù)。因此 url.py 將成為 -

# Filename : example.py
# Copyright : 2020 By Nhooo
# Author by : www.soo66.com
# Date : 2020-08-08
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'),)
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清