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主要是对路由进行反向解析,通过路由命名和路由地址来获取路由信息。在使用这两个函数的时候,需要注意两者所传入的参数类型和返回值的数据类型。

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