django 路由詳解(四)反向解析
阿新 • • 發佈:2022-04-03
什麼是路由正向解析?什麼又是反向解析呢?
以django的請求生命週期為例,當用戶在瀏覽器中訪問網頁時,在django路由列表裡查詢要跳轉到那個地址,在根據地址裡面的檢視函式或檢視類進行相應的處理,然後再將結果作為響應內容返回瀏覽器(也就是請求的響應內容),這是路由的正向解析過程,這個過程是不可逆的。
而路由的反向解析就是在視圖裡使用路由的過程,django的反向解析主要由函式reverse和resolve實現:函式reverse是通過路由名稱空間或可呼叫檢視物件來生成路由地址;函式resolve是通過路由地址來獲取路由物件資訊。
#在django專案下的路由urls.py資訊 from django.contrib import adminfrom django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), #指向myApp的路由檔案urls.py,自定義名稱空間myApp path("",include(("myApp.urls","myApp"),namespace="myApp")), ]
在應用myApp裡面的urls.py中定義路由名稱
#myApp urls.py from operator import index from django.urls import path,re_pathfrom . import views urlpatterns = [ #定義name的名稱為mydate path("<year>/<int:month>/<slug:day>",views.mydate,name="mydate"), path("",views.index,name="index"), ]
修改myApp檢視views.py的函式資訊:
from django.shortcuts import render from django.http import HttpResponse from django.shortcuts import reversefrom django.urls import resolve # Create your views here. def mydate(request,year,month,day): #將介面傳入的引數存入args列表中,在生成地址時賦值 args = [year,month,day] #先使用reverse生成新的地址 再使用resolve解析地址裡面的資訊 result = resolve(reverse("myApp:mydate",args=args))
#列印解析出來的路由地址資訊 print("kwargs:",result.kwargs) print("url_name:",result.url_name) print("namespace",result.namespace) print("view_name",result.view_name) print("app_name",result.app_name) print("func:",result.func) print("route:",result.route) return HttpResponse(str(year)+"-"+str(month)+"-"+str(day)) def index(request): kwargs = {"year":2022,"month":4,"day":10} args = ["2022","04","03"] #使用reverse生成路由地址 print(reverse("myApp:mydate",args=args)) print(reverse("myApp:mydate",kwargs=kwargs)) return HttpResponse(reverse("myApp:mydate",args=args))
看一下index檢視函式在瀏覽器中,顯示的路由相對地址,如下:
再來看一下,訪問mydate後,在伺服器上列印的解析的資訊:
在伺服器上,列印的解析出來的路由引數、url地址、名稱空間、檢視物件、函式、路由的資訊如下: