Django之url函数、有名无名分组、反向解析

君自故乡来,应知故乡事 / 2023-07-31 / 原文

一、url函数的使用(支持正则表达式)

1、django 1.x 版本中使用的是url

url('test', views.test),
url函数的第一个参数是支持正则表达式的
如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数

2、http://127.0.0.1:8000/test/

/是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配

APPEND_SLASH = False # 设置默认不斜杠匹配

3、django 2.x 版本中使用的是path

path('test/', admin.site.urls), # path是不支持正则的,它是精准匹配,输入的内容和路由地址必须是完全不配

re_path支持正则

re_path('^test/$', admin.site.urls) # django1中的url是完全一样的 

二、无名、有名分组

无名分组和有名分组在Django的URL配置中用于捕获动态部分,并将其传递给视图函数,让你能够轻松处理动态URL的情况,并且提高代码的可读性。

有名分组和无名分组不要一起使用

1、无名分组(django1)

urlpatterns = [

            url('^test/(\d+)/(\d+)$', views.test),
]    

上述的url中有两个无名的()分组,需要将两个参数写到视图函数中

无名分组就是把路由地址匹配的的数据以位置参数的形式传递给视图函数

def test(request, xx, yy):
    print(xx, yy) # 123
    return HttpResponse("test")

2、有名分组(django1)

urlpatterns = [

            url('^testadd/(?P<year>\d+)/(?P<month>\d+)$', views.testadd)
]   

有名分组就是把路由地址匹配的的数据以关键字参数的形式传递给视图函数

def testadd(request, year, ,month):
    print(year, month) 
    return HttpResponse("test")  

django2中的用法

re_path('^test/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)$', views.test),
re_path('^testadd/(?P<year>\d+)/(?P<month>\d+)/(?P<month>\d+)/(?P<month>\d+)$', views.testadd)

三、反向解析

反向解析使你能够以更动态和灵活的方式生成URL,避免硬编码URL,提高代码的可维护性,并为重定向和链接生成提供了便利的方法

1、书写位置:

路由层 urlpatterns的第三个参数

urlpatterns = [
    path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
]

补充:

django2中的path函数支持的5种转换器,也支持自定义转换器

Django默认支持以下5个转化器:

● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
● int,匹配正整数,包含0。
● slug,匹配字母、数字以及横杠、下划线组成的字符串。
● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

urlpatterns = [  
    path('articles/2003/', views.special_case_2003),  
    path('articles/<int:year>/', views.year_archive),  
    path('articles/<int:year>/<int:month>/', views.month_archive),  
    path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),  
  # path才支持,re_path不支持
  path('order/<int:year>',views.order),
]

2、后端解析

如:访问某一个页面,该视图函数下解析路由层的某一个名字

urls:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/v1/', views.test, name='test'),
    url(r'^home/', views.home),
]

views:需要导入 reverse方法

from django.shortcuts import render, HttpResponse, redirect, reverse

def test(request):
    print('123')
    return HttpResponse('test')

# home视图函数解析test,解析到test的url的地址
def home(request):
    print(reverse('test'))
    return HttpResponse('home')

 

3、 前端解析

<a href="{% url 'test' %}">点我</a> 

 

4、有名分组反向解析

 

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/(\d+)$/', views.test, name='test'),
    url(r'^home/', views.home),
]

 

 

 

 

5、

 

 

 

 

四、路由分发

1、

2、

3、

4、