系列導讀
01. Django 系列篇(一):Hello World!
上面 Django 定義的路由只能代表一個(gè)頁(yè)面,為了使路由指向多個(gè)不同的頁(yè)面,可以在路由中定義變量
變量類(lèi)型有:整形、字符串、slug、uuid 4 種
其中:
1、字符串:匹配任何非空字符串,但不包含斜杠,默認使用字符串類(lèi)型
2、整形:匹配任何非負數
3、slug:匹配 ASCII 字符以及連接線(xiàn)和下劃線(xiàn),可理解為注釋、后綴或附屬等概念
4、uuid:匹配一個(gè) uuid 格式的對象,為了防止路由沖突,所有字母必須小寫(xiě),然后用 - 連接起來(lái),比如:0755-2323-1111-abcd-3f3g
以匹配年、月、日的視圖為列
首先,在 App 的路由集合下新增一條路由信息
# urls.py(App)
# 指向日期視圖函數
# year:字符串
# month:整形
# day:slug類(lèi)型
path('<year>/<int:month>/<slug:day>', views.ymd_with_params),
其中,使用變量符號 <> 為路由設置變量,: 之前代表變量類(lèi)型,: 之后代表變量名;如果沒(méi)有指定變量類(lèi)型,默認為字符串類(lèi)型
然后,在 App 下的 view.py 文件中編寫(xiě)路由定義的視圖函數
視圖函數中包含 4 個(gè)參數,其中第 1 個(gè)參數為:request,其他 3 個(gè)參數為:路由信息包含的 3 個(gè)變量
需要注意的是,視圖函數的參數必須和路由信息包含的變量一一對應,否則會(huì )拋出異常
# views.py(App)
def ymd_with_params(request, year, month, day):
"""
日期視圖函數
:param request:
:return:
"""
result = str(year) + '/' + str(month) + "/" + str(day)
return HttpResponse(result)最后運行項目,在瀏覽器下輸入路由地址,比如:http://127.0.0.1:8000/2020/04/20
除了在路由地址中設置變量外,還可以為 path 函數追加一個(gè)變量
需要注意的是,變量必須以字典的形式表示,參數值不限制數據格式,可以是實(shí)體對象,也可以是基本數據類(lèi)型
# urls.py(App)
# 新建一個(gè)路由地址airpython
# 指向視圖函數with_extra_params
# 并帶有參數,參數通過(guò)字典定義
path('airpython', views.with_extra_params, {'extra_param': 'AirPython'}),
然后,在視圖函數 with_extra_params() 中來(lái)使用這個(gè)參數
# views.py(App)
def with_extra_params(request, extra_param):
"""
帶額外的參數
:param request:
:param extra_param:
:return:
"""
return HttpResponse('Welcome to attention ' + extra_param)
正則表達式可以限制路由地址中的變量取值范圍,對路由變量進(jìn)行截取與判斷,使得路由匹配更加地精確合理
路由正則表達式使用函數 re_path 來(lái)定義,以小括號 ( ) 為一個(gè)部分單位,每個(gè)小括號以 ?P 開(kāi)頭,加入正則表達式,最后通過(guò)斜杠 / 隔開(kāi)即可
上面的路由地址可以通過(guò)正則表達式改寫(xiě)為:
# 路由正則表達式
# 函數:re_path(路由地址,視圖函數)
# 路由地址:year、month、day為3個(gè)參數
re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2}).html',views.ymd_with_params1)
其中,用 <> 包住的 year、month、day 為 3 個(gè)變量
接著(zhù)定義視圖函數,運行項目,就可以通過(guò)地址訪(fǎng)問(wèn)到視圖函數渲染的內容。
def ymd_with_params1(request,year, month, day):
"""
日期視圖函數(正則表達式)
:param request:
:param year:
:param month:
:param day:
:return:
"""
result = str(year) + '/' + str(month) + "/" + str(day)
return HttpResponse(result)隨著(zhù)網(wǎng)頁(yè)的數目增加,維護會(huì )有一定難度,因此,Django 可以為每一條路由設置命名空間,方便我們更好地管理網(wǎng)站
通過(guò)查看源碼,發(fā)現路由函數 include() 有兩個(gè)參數,分別是:arg、namespace,其中 namespace 代表路由的命名空間,為可選參數;arg 參數類(lèi)型為字符串或元組(長(cháng)度為:2 ),作用是指向項目某一個(gè) App 的 urls.py 文件
需要注意的是:
1、如果路由函數不存在命名空間,arg 的數據格式是字符串,比如:first_app.urls,指向 first_app 這個(gè) App 的 urls.py 路由文件
2、如果路由函數命名空間存在,arg 的數據格式一定要設置為長(cháng)度為 2 的元組,比如:('first_app.urls','first_app'),其中第一個(gè)參數為目標 App 的 urls.py 文件,第二個(gè)參數一般設置為 App 的名稱(chēng)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
# 指向admin后臺系統的路由文件
path('admin/', admin.site.urls),
# 指向first_app的路由文件:urls.py
# namespace:設置路由的命令空間
path('', include(('first_app.urls', 'first_app'), namespace='first_app')),
# 指向本App的路由文件:urls.py
path('second/', include(('second_app.urls', 'second_app'), namespace='second_app')),
]
在 Django 中,路由名稱(chēng)是對一個(gè)路由進(jìn)行命名,作用是在視圖、模塊里使用路由命名生成路由地址,在后期路由地址發(fā)生變更的時(shí)候,方便維護和更新
路由定義列表中,可以為函數 path() 和 re_path() 的 name 屬性指定一個(gè)值,相當于給路由指定了名稱(chēng)
urlpatterns = [
# 指向視圖函數index
# 添加路由name屬性
path('', views.index, name='index'),
]
不同 App 中的路由命令可以重復使用,但是在同一個(gè) App 內,最好保證路由名稱(chēng)的唯一性。
聯(lián)系客服