玩轉Django2.0---Django筆記建站基礎三(編寫URL規則)

第三章  編寫URL規則html

  URL(Uniform Resource Locator,統一資源定位符)是對能夠從互聯網上獲得的資源位置和訪問方法簡潔的表示,是互聯網上標準資源的地址。正則表達式

  在App裏因爲Django默認沒有urls文件須要新建一個urls路由文件,是將屬於App中的URL都寫入到該文件中,而項目根目錄的urls.py是將每一個App的urls.py統一管理。當程序收到用戶請求的時候,首先在根目錄的urls.py查找該URL是屬於那個App,而後再從App的urls.py找到具體的URL信息。在根目錄的urls.py規則,以下所示:django

 

 

from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('',include('index.urls')) ]

  上述代碼設定了兩個URL地址,分別是Admin站點管理和首頁地址。其中Admin站點管理是在建立項目時已自動生成,通常狀況下無須更改。urls的代碼解析以下:瀏覽器

    from django.contrib import admin:導入Admin功能模塊函數

    from django.urls import path,include:導入URL編寫模塊網站

    urlpatterns[]:整個項目的URL集合,每一個元素表明一條URL信息ui

    path('admin/', admin.site.urls):設定Admin的URL。'admin/'表明127.0.0.1:8000/admin地址信息,admin後面的斜槓是路徑分隔符;admin.site.urls是URL的處理函數,也稱爲視圖函數url

    path('',include('index.urls')):URL爲空,表明爲網站的域名,即127.0.0.1:8000,一般是網站的首頁;include將該URL分發給index的urls.py處理。spa

  因爲首頁的地址分發給index的urls.py處理,所以下一步須要對index的urls.py編寫URL信息,代碼以下:3d

from django.urls import path from index import views urlpatterns = [ path('',views.index) ]

  index的urls.py的編寫規則與根目錄的urls.py大體相同,基本上全部的URL都是有固定編寫格式的。上述代碼導入了同一目錄下的views.py文件,該文件用於編寫視圖函數,處理URL請求信息並返回網頁給用戶。所以,在views.py中編寫index函數的處理過程以下:

from django.shortcuts import render from django.http import HttpResponse # Create your views here.

def index(request): return HttpResponse("Hello world")

  index函數必須設置參數request,該參數表明當前用戶的請求對象,該對象包含用戶名、請求內容和請求方式等信息,視圖函數執行完成後必須使用return將處理結果返回,不然程序會拋出異常信息。啓動MyDjango項目,在瀏覽器中打開http://127.0.0.1:8000/,返回結果以下:

   3.2帶變量的URL

  URL的變量類型有字符類型、整型、slug和uuid,最爲經常使用的是字符類型和整型。各個類型說明以下:

    字符類型:匹配任何非空字符串,但不含斜槓。若是沒有指定類型,默認使用該類型。

    整型:匹配0和正整數。

    slug:可理解爲註釋、後綴或附屬等概念,常做爲URL的解釋性字符。可匹配任何ASCII字符以及鏈接符和下劃線,能使URL更加清晰易懂。好比網頁的標題是"13歲的孩子",其URL地址能夠設置爲"13-sui-de-hai-zi"。

    uuid:匹配一個uuid格式的對象。爲了防止衝突,規定必須使用破折號而且全部字母必須小寫,例如075194d3-6885-417e-a8a8-6c931e272f00

  根據上述變量類型,在index的urls.py裏添加帶有字符類型、整型和slug的URL地址信息,代碼以下:

#index的urls.py

from django.urls import path from index import views urlpatterns = [ path('',views.index), path('<year>/<int:month>/<slug:day>', views.mydate), ]

  在URL中使用變量符號"<>"能夠爲URL設置變量。在括號裏面以冒號劃爲兩部分,前面表明的是變量的數據類型,後面表明的是變量名,變量名可自行命名。上述代碼對新增的URL設置了三個變量值,分別是<year>、<int:month>和<slug:day>,變量說明以下:

    <year>:變量名爲year,數據格式爲字符類型,與<str:year>的含義同樣。

    <int:month>:變量名month,數據格式爲整型

    <slug:day>:變量名爲day,數據格式爲slug

  而後在views.py中編寫視圖函數mydate的處理方法,代碼以下:

#views.py的mydate函數

def mydate(request, year, month, day): return HttpResponse(str(year) +'/'+ str(month) +'/'+ str(day))

  視圖函數mydate有4個函數參數,其中參數year、month和day來自於URL的變量。URL的變量和視圖函數的參數要一一對應,若是視圖函數的參數與URL的變量對應不上,那麼程序會拋出參數不相符的報錯信息。啓動項目,在瀏覽器輸入http://127.0.0.1:8000/2019/09/02,運行結果以下:

 

  在上述例子中,URL的變量分別表明年、月、日。若是使用正則表達式限制URL的可變範圍。編寫規則以下:

from django.urls import path,re_path from index import views urlpatterns = [ path('',views.index), # path('<year>/<int:month>/<slug:day>', views.mydate),
    re_path('(?P<year>[0-9]{4})/(?P<mount>[0-9]{2})/(?P<day>[0-9]{2}).html',views.mydate), ]

  在URL中引入正則表達式,首先導入re_path功能模塊,正則表達式的做用是對URL的變量進行截取與判斷,以小括號表示,每一個小括號的先後可使用斜槓或者其它字符將其分隔。以上代碼爲例,分別將變量year、month和day以斜槓分隔,每一個變量以一個小括號爲單位,在小括號內,可分爲三個部分,以(?P<year>[0-9]{4})爲例進行以下介紹:

    ?P是固定格式

    <year>爲變量的編寫規則

    [0-9]{4}是正則表達式的匹配模式,表明變量的長度爲4,只容許取0-9的值。

  若是在URL的末端使用正則表達式,那麼在該URL的末端應加上斜槓或者其它字符,不然正則表達式沒法生效。例如上述例子的變量day,若在末端沒有設置".html",則在瀏覽器上輸入無限長的字符串,程序也能正常訪問。

  3.3設置參數name

  除了在URL裏面設置變量以外,Django還能夠對URL進行命名,在index的urls.py、views.py和模板myyear.html中添加如下代碼:

#在url.py添加新的URL信息
re_path('(?P<year>[0-9]{4}).html',views.myyear, name='myyear'), #views.py添加對應的視圖函數
def myyear(request, year): return render(request, 'myyear.html') #templates文件夾添加myyear.py文件:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div><a href="/2018.html">2018 old Archive</a></div>
    <div><a href="{% url 'myyear' 2018 %}">2018 Archive</a></div>
</body>
</html>

  上述代碼分別從URL、視圖函數和HTML模板來講明參數name的具體做用,整個流程執行流程以下:

  (1)當用戶訪問該URL時,項目根據URL信息選擇視圖函數myyear處理,並將該URL命名爲myyear。

  (2)視圖函數myyear將模板myyear.html做爲響應內容並生成相應的網頁返回給用戶。

  (3)在模板myyear.html中分別設置兩個標籤a,雖然兩個標籤a的href屬性值的寫法有所不一樣,但實質上二者都指向命名爲myyear的URL地址信息。

  (4)第二個標籤a的href爲{% url 'myyear' 2018 %},這是Django的模板語法,模板語法以{% %}表示。其中,url ‘myyear’是將命名爲myyear的URL地址信息做爲href屬性值;2018是該URL的變量year,若URL沒有設置變量值,則無須添加。

  上述例子運行結果以下:

#在瀏覽器裏面輸入http://127.0.0.1:8000/2012.html

 

 

   3.4設置額外參數

  除了參數name以外,還有一種參數類型是以字典的數據類型傳遞的,該參數沒有具體命名,只要是字典形式便可,並且該參數只能在視圖函數中讀取和使用。代碼以下:

#參數爲字典的URL
re_path('dict/(?P<year>[0-9]{4}).html',views.myyear_dict,{'month':'05'}, name='myyear_dict')
#參數爲字典的URL的視圖函數
def
myyear_dict(request, month): return render(request, 'myyear_dict.html', {'month':month})
#在templates文件夾添加myyear_dict.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="{% url 'myyear_dict' 2018 %}">2018 {{ month }} Archive</a>
</body>
</html>

  上述代碼分別從URL、視圖函數和HTML模板來講明URL額外參數的具體做用,說明以下:

    一、除了在URL地址信息中設置參數name以外,還加入了參數{‘month’:'05'},該參數用於設置參數month,參數值爲05.

    二、而後視圖函數myyear_dict獲取了變量year和參數month,前者設置在URL地址中,然後者在URL地址外。

    三、最後視圖函數將參數month的值傳遞到HTML模板並生成HTML網頁返回給用戶。運行結果如圖:

#瀏覽器輸入以下URL
http://127.0.0.1:8000/dict/2019.html

 

 

 

 

 

   

  在編寫URL規則時,若是須要設置額外參數,設置規則以下:

    一、參數只能以字典的形式表示。

    二、設置的參數只能在視圖函數讀取和使用。

    三、字典的一個鍵值對錶明一個參數,鍵表明參數名,值表明參數值。

    四、參數值沒有數據格式限制,能夠爲某個對象、字符串或列表(元組)等。

  3.5小結

   統一資源定位符(Uniform Resource Locator, URL)是對能夠從互聯網上獲得的資源位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。互聯網上的每一個文件都有一個惟一的URL,用於指出文件的路徑位置。簡單的說,URL就是常說的網址,每一個地址表明不一樣的網頁,在Django中,URL也稱爲URLconf。

  URL的基本規則以下,以根目錄的urls.py爲例:

    一、from django.contrib import admin:導入Admin功能模塊

    二、from django.urls import path,include:導入URL編寫模塊

    三、urlpatterns:整個項目的URL集合,每一個元素表明一個URL信息

    四、path('admin/', admin.site.urls),設定Admin的URL。'admin/'表明127.0.0.1:8000/admin地址信息,admin後面的斜槓是路徑分隔符;admin.site.urls是URL的處理函數,也成爲視圖函數

    五、path('',include('index.urls')):URL爲空,表明網站的域名,即127.0.0.1:8000,一般是網站的首頁;include將該URL分發給index的urls.py處理

  URL的變量類型有字符類型、整型、slug和uuid,最爲經常使用的是字符類型和整型。各個類型的說明以下:

    字符類型:匹配任何非空字符串,但不含斜槓。若是沒有指定類型,默認使用該類型。

    整型:匹配0和正整數

    slug:可理解爲註釋、後綴或附屬等概念,常做爲URL的解釋性字符。可匹配任何ASCII字符以及鏈接符和下劃線,能使URL更加清晰易懂。好比網頁的標題是"13歲的孩子"其URL地址能夠設置爲"13-sui-de-hai-zi"

    uuid:匹配一個uuid格式的對象。爲了防止衝突,規定必須使用破折號而且全部字母必須小寫,例如

  在URL中引入正則表達式,首先導入re_path功能模塊,正則表達式的做用是對URL的變量進行截取與判斷,以小括號表示,每一個小括號的先後可使用斜槓或者其它字符將其分隔。以上述表明爲例,分別將變量year、month和day以斜槓分割,每一個變量以一個小括號爲單位,在小括號內,可分爲三部分以(?P<year>[0-9]{4})爲例:

    ?P是固定格式

    <year>爲變量的編寫規則

    [0-9]{4}是正則表達式的匹配模式,表明變量的長度爲4,只容許取0-9的值。

  值得注意的是,若是URL的末端使用正則表達式,那麼在該URL的末端應加上斜槓或者其它字符,不然正則表達式沒法生效。例如上述例子的變量day,若在末端沒有設置".html",則在瀏覽器上輸入無限長的字符串,程序也能正常訪問。

  參數name的做用是對URL地址進行命名,而後在HTML模板中使用能夠生成相應的URL信息,在URL中設置參數name,只要參數name的值不變,不管URL地址信息如何修改都無須修改模板中標籤a的href屬性值。

  在編寫URL規則時,若是要須要設置額外參數,設置以下:

    一、參數只能以字典的形式表示

    二、設置的參數只能在視圖函數中讀取和使用

    三、字典的一個鍵值對錶明一個參數,鍵表明參數名,值表明參數值

    四、參數值沒有數據格式限制,能夠爲某個對象、字符串或列表(元組)等

相關文章
相關標籤/搜索