Django2.X—反向解析reverse與resolve

反向解析reverse與resolve

路由除了在模板裏使用之外,還可以在視圖裏使用。我們知道Django的請求生命週期是指用戶在瀏覽器訪問網頁時,Django根據網址在路由列表裏查詢相應的路由,再從路由裏找到視圖函數或視圖類進行處理,將處理結果作爲響應內容返回瀏覽器並生成網頁內容。這個生命週期是不可逆的,而在視圖裏使用路由這一過程被稱爲反向解析。 Django的反向解析主要由函數reverse和resolve實現,函數reverse是通過路由命名或視圖對象來生成路由地址的;函數resolve是通過路由地址來獲取路由對象信息的。
在MyDjango文件夾的urls.py和index文件夾的urls.py裏定義路由地址。代碼如下:

# 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','index'),namespace ='index'),
]

# index文件夾的urls.py
from django.urls import path
from . import views
urlpatterns = [
	re_path('<year>/<int:month>/<slug:day>',view.mydate,name='mydate'),
	# 定義路由的首頁
	path('',views.index,name = 'index')
]

由於反向解析函數reverse和resolve常用於視圖(views.py)、模型(models.py)或Admin後臺(admin.py)等,因此在視圖(views.py)的函數mydate和index裏分別使用reverse和resolve,代碼如下:

from django.http import HttpResponse
from django.shortcuts import reverse
from django.urls import resolve

def mydate(request, year, month, day):
    args = ['2019', '12', '12']
    result = resolve(reverse('index: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)
    return HttpResponse(str(year) + '/' + str(month) + '/' + str(day))

def index(request):
    kwargs = {'year': 2010, 'month': 2, 'day': 10}
    args = ['2019', '12', '12']
    print(reverse('index:mydate', args=args))
    print(reverse('index:mydate', kwargs=kwargs))
    return HttpResponse(reverse('index:mydate', args=args))

函數index主要使用反向解析函數reverse來生成路由mydate的路由地址。爲了進一步瞭解reverse,我們可以查看reverse的源碼文件。
函數reverse設有必選參數viewname,其餘參數是可選參數,各個參數說明如下:

  • viewname: 代表路由命名或可調用視圖對象,一般情況下是以路由命名name來生成路由地址的
  • urlconf: 設置反向解析的URLconf模塊。默認情況下,使用配置文件settings.py的ROOT_URLCONF屬性(MyDjango文件夾的urls.py)
  • args: 以列表方式傳遞路由地址變量,列表元素順序和數量應與路由地址變量的順序和數量一致。
  • kwargs: 以字典方式傳遞路由地址變量,字典的鍵必須對應路由地址變量名,字典的鍵值對數量與變量的數量一致。
  • current_app: 提示當前正在執行的視圖所在的項目應用,主要起到提示作用,在功能上並無實質的作用。

一般情況下只需設置函數reverse的參數viewname即可,如果路由地址設置變量,那麼可自行選擇參數args或kwargs設置路由地址的變量值。
接下來分析視圖函數mydate,它是在函數reverse的基礎上使用函數resolve。我們可以查看函數resolve源碼,可以看到,resolve設有兩個參數,參數path是必選參數,urlconf是可選參數。

  • path: 代表路由地址,通過路由地址來獲取對應的路由對象信息。
  • urlconf: 設置反向解析的URLconf模塊。默認情況下,使用配置文件settings.py的ROOT_URLCONF屬性(MyDjango文件夾的urls.py)。函數resolve是以對象作爲返回值的,該對象內置多種函數方法獲取具體的路由信息。具體函數可網上搜索。

綜上所說,函數reverse和resolve主要是對路由進行反向解析,通過路由命名和路由地址來獲取路由信息。在使用這兩個函數的時候,需要注意兩者所傳入的參數類型和返回值的數據類型。

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