Django2.X—路由定義規則

一個完整的路由包含:路由地址、視圖函數(或者視圖類)、可選變量和路由命名。

1、路由定義規則

路由稱爲URL,是對可以從互聯網上得到的資源位置和訪問方法的一種簡潔的表示,是互聯網標準資源的地址。互聯網上的每個文件都有一個唯一的路由,用於指出網絡文件的路徑位置。簡單說,路由可視爲我們常說的網址,每個網址代表不同的網頁。

1.1 Django2.X路由定義

這種路由設計模式下,工作原理如下:

  1. 運行MyDjango項目時,Django從MyDjango文件夾的urls.py找到各個App所定義的路由信息,生成完整的路由列表。
  2. 當用戶在瀏覽器上訪問某個路由地址時,Django就會收到該用戶的請求信息。
  3. Django從當前請求信息獲取路由地址,並在路由列表裏匹配相應的路由信息,再執行路由信息所指向的視圖函數(或視圖類),從而完成整個請求響應過程。

MyDjango文件夾的urls.py代碼如下:

from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    # 指向內置Admin後臺系統的路由文件sites.py
    path('admin/',admin.site.urls),
    # 指向index的路由文件urls.py
    path('',include('index.urls')),
]

MyDjango文件夾的urls.py定義兩條路由信息,分別是Admin站點管理和首頁地址(index)。其中,Admin站點管理在創建項目時已自動生成,一般情況下無需修改;首頁地址是指index文件夾的urls.py。MyDjango文件夾的urls.py的代碼解釋如下:

  • from django.contrib import admin:導入內置Admin功能模塊。
  • from django.urls import path,include:導入Django的路由函數模塊。
  • urlpatterns:代表整個項目的路由集合,以列表格式表示,每個元素代表一條路由信息。
  • path(‘admin/’,admin.site.urls):設定Admin的路由信息。'admin/'代表127.0.0.1:8000/admin的路由地址,admin後面的斜槓是路徑分隔符,其作用等同於計算機中文件目錄的斜杆符號;admin.site.urls指向內置Admin功能所自定義的路由信息,可以在Python目錄Lib\site-packages\django\contrib\admin\sites.py找到具體定義過程。
  • path(’’,include(‘index.urls’)):路由地址爲“\”,即127.0.0.1:8000,,通常是網站的首頁;路由函數include是將該路由信息分發給index的urls.py處理。這裏的index的urls.py來源在前面博客中講到了。

由於首頁地址分發給index的urls.py處理,因此下一步需要對index的urls.py編寫路由信息。如下:

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

index的urls.py的編寫規則與MyDjango文件夾的urls.py大致相同,這是最爲簡單的定義方法,此外可參考內置Admin功能的路由定義方法。
在index的urls.py導入index的views.py文件,該文件用於編寫視圖函數或視圖類,主要用於處理當前請求信息並返回響應內容給用戶。路由信息path(’’,views.index)的views.index是指視圖函數index處理網站首頁的用戶請求和響應過程。因此,在index的views.py中編寫index函數的處理過程,代碼如下:

from django.shortcuts import render
def index(request):
    return render(request,'index.html')

index函數必須設置一個參數,參數命名不固定,但常以request進行命名,代表當前用戶的請求對象,該對象包含當前請求的用戶名、請求內容和請求方式等。
視圖函數執行完成後必須使用return將處理結果返回,否則程序會拋出異常信息。啓動MyDjango項目,在瀏覽器裏訪問即可。
路由文件urls.py的路由定義規則是相對固定的,路由列表由urlpatterns表示,每個列表元素代表一條路由。路由由Django的path函數定義的,該函數第一個參數是路由地址,第二個參數是路由所對應的處理函數(視圖函數或視圖類),這兩個參數是路由定義的必選參數。

1.2 路由變量的設置

在日常開發過程中,有時一個路由代表多個不同的頁面,如編寫帶有日期的路由,若根據前面的編寫方式,按一年計算,則需要開發者編寫365個不同的路由才能實現,實現這種做法明顯是不可取的。因此,Django在定義路由時,可以對路由設置變量值,使路由具有多樣性。
路由的變量類型有字符類型、整型、slug和uuid,最爲常用的使字符類型和整型。各個類型說明如下:

  • 字符類型: 匹配任何非空字符串,但不含斜杆,如果沒有指定類型,就默認使用該類型。
  • 整型: 匹配0和正整數。
  • slug: 可理解爲註釋、後綴或附屬等概念,常作爲路由的解釋性字符。可匹配ASCII字符以及連接符和下畫線,能使路由更加清晰易懂。比如網頁的標題是"14歲的小娃娃",其路由地址可以設置爲“14-sui-de-xiaowawa”。
  • uuid: 匹配一個uuid格式的對象。爲了防止衝突,規定必須使用“-”並且所有字母必須小寫,例如:075446e5-4646-fajkl46468

根據上述變量類型,在MyDjango項目的index文件夾的urls.py裏新定義路由,並且帶有字符類型、整型和slug的變量,代碼如下:

# index的urls.py文件
from django.urls.import.path
from . import views
urlpatterns = [
	# 添加帶有字符類型、整型和slug的路由
	path('<year>/<iny:month>/<slug:day>',views.myvariable)
]

在路由中,使用變量符號“<>”可以爲路由設置變量。在括號裏面以冒號劃分爲兩部分,冒號前面代表的是變量的數據類型,冒號後面代表的是變量名,變量名可自行命名,如果沒有設置變量的數據類型,就默認爲字符類型。上述代碼設置了3個變量,分別是<year>、<int:month>和<slug:day>,變量說明如下:

  • <year>:變量名爲year,數據格式爲字符類型,與<str:year>的含義一樣。
  • <int:month>:變量名爲month,數據格式爲整型。
  • <slug:day>:變量名爲day,數據格式爲slug。

在上述新增的路由中,路由的處理函數爲myvariable,因此在index的views.py中編寫myvariable的處理過程,代碼如下:

# views.py的myvariable函數
from django.http import HttpResponse
def myvariable(request,year,month,day):
	return HttpResponse(str(year)+'/'+str(month)+'/'+str(day))

啓動項目,在瀏覽器上輸入127.0.0.1:8000/2020/04/19,運行結果則輸出2020/4/19。如果瀏覽器輸入的路由地址與其變量類型不相符合,Django就會提示Page not found。路由的變量和視圖函數的參數要一一對應,如果視圖函數的參數與路由的變量對不上,那麼程序會拋出不相符的報錯信息。
除了在路由地址設置變量外,Django還支持在路由地址外設置變量(路由的可選變量)。在index的urls.py和views.py中分別新增路由和視圖函數。代碼如下:

# index的urls.py
from django.urls import path
from . import views
urlpatterns = [
	# 添加帶有字符類型、整型和slug的路由
	path('<year>/<iny:month>/<slug:day>',views.myvariable),
	# 添加路由地址外的變量month
	path('',views.index,{'month':'2019/10/10'})
]

# index的views.py
from django.http import HttpResponse
def myvariable(request,year,month,day):
	return HttpResponse(str(year)+'/'+str(month)+'/'+str(day))
	
def index(request,month):
	return HttpResponse('這是路由地址之外的變量:'+month)

從上述代碼可以看出,路由函數path的第3個參數是{‘month’:‘2019/10/10’},該參數的設置則如下:

  • 參數只能以字典的形式表示。
  • 設置的參數只能在視圖函數中讀取和使用。
  • 字典的一個鍵值對代表一個參數,鍵值對的鍵代表參數名,鍵值對的值代表參數值。
  • 參數值沒有數據格式限制,可以爲某個實例對象,字符串或列表(元組)等。

視圖函數index的參數必須對應字典的鍵,如果字典裏設置兩對鍵值對,視圖函數就要設置相應的函數參數,否則在瀏覽器上訪問的時候就會提示報錯信息。

1.3 正則表達式的路由定義

前面設置路由地址分別代表日期的年、月、日,其變量類型分別是字符類型、整型和sulg,因此在瀏覽器上輸入127.0.0.1/AAAA/05/01是合法的,但是不符合日期格式要求。爲了進一步規範日期格式,可以使用正則表達式限制路由地址變量的取值範圍。在index文件夾的urls.py裏使用正則表達式定義路由地址,代碼如下:

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

路由的正則表達式是由路由函數re_path定義的,其作用是對路由變量進行截取與判斷,正則表達式是以小括號爲單位的,每個小括號的前後可以使用斜杆或者其他字符將其分隔與結束。以上代碼爲例,分別將變量year、month和day以斜杆隔開,每個變量以一個小括號爲單位,在小括號內,可分爲3部分,以(?P<year>[0-9]{4})爲例。

  • ?P是固定格式,字母P必須爲大寫。
  • <year>爲變量名
  • [0-9]{4}是正則表達式的匹配模式,代表變量的長度爲4,只允許取0~9的值。

上述路由的處理函數mydate函數,因此還需要在index的views.py中編寫視圖函數mydate,代碼如下:

# views.py的mydate函數
from django.http import HttpResponse
def mydate(request,year,month,day):
    return HttpResponse(str(year)+'/'+str(month)+'/'+str(day))

路由地址末端設置了".html",這是一種僞靜態URL技術,可將網址設置爲靜態網址,用於SEO搜索引擎的爬取,如百度、谷歌等。此外,在末端設置".html"是爲變量day設置終止符,假如末端沒有設置".html",在瀏覽器上輸入無限長的字符串,路由也能正常訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章