目录

一、路由匹配

  • django2.X及以上 path第一个参数写什么就匹配什么
  • django1.X第一个参数是正则表达式
    PS:无论什么版本django都自带加斜杠后缀的功能 也可以取消,这里如果在浏览器地址栏没有写完整的/index/,而是/index,这里还是可以找到的,因为Django会帮你二次查找,浏览器会有303重定向的提示码,需要去配置文件中最底下加 APPEND_SLASH = False(默认情况是True)

二、转换器

定义

转换器: 将对应位置匹配到的数据转换成固定的数据类型,正常情况下很多网站都会有很多相似的网址 ,如果我们每一个都单独开设路由不合理,所以就需要用转换器的知识来解决
django2.X及以上版本路由动态匹配有转换器(五种)

  • str:匹配除路径分隔符外的任何非空字符串。
    
  • int:匹配0或者任意正整数。
    
  • slug:匹配任意一个由字母或数字组成的字符串。
    
  • uuid:匹配格式化后的UUID。
    
  • path:能够匹配完整的URL路径
    

ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容)

    path('index/<str:info>/', views.index_func),  # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容')
    path('index/<str:info>/<int:id>/', views.index_func)  # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容',id='转换器匹配到的类型转换之后的内容')

错误分析:
Django之路由层   (有名和无名分组  反向解析 路由分发  名称空间)-小白菜博客
这里报错的原因是因为少接收了一个参数
Django之路由层   (有名和无名分组  反向解析 路由分发  名称空间)-小白菜博客
转换匹配之后得到的内容要被视图函数接收到实参request后面,接收几个转换匹配的内容就要相对应传几个参数
image

三、正则匹配

定义

匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功会立刻停止路由层其他的匹配直接执行对应的视图函数
  • django2.X及以上版本有re_path 第一个参数是正则
    ps:用之前记得导入模块
    Django之路由层   (有名和无名分组  反向解析 路由分发  名称空间)-小白菜博客
    re_path('^test/$', views.test)
    django1.X路由匹配使用的是url() 功能与django2.X及以上的re_path()一致

四、正则匹配之无名分组和有名分组

分组定义:把一个正则表达式用小括号括起来

  • 无名分组

把括号内匹配的内容当成位置参数传递给视图函数,记得在request参数后面写一个随机位置参数接收

    	re_path('^test/(\d{4})/', views.test)
  • 有名分组

会将括号内正则匹配到的内容当做关键字参数传递给视图函数,记得在request参数后面写自己定义的参数接收

    	re_path('^test/(?P<year>\d{4})/', views.test)

ps:注意上述的分组不能混合使用!!!(.?)贪婪匹配

五、反向解析

定义

URL搜索地址的时候,我们为了方便后期随意改变路由的名称,可以给每一个路由起一个别名,然后,通过一些方法反向解析这个路由名字,可以得到这个路由对应的地址

  • 基本使用

1.路由匹配关系起别名

    path('login001/', views.login, name='login_view(随意起个别名)')

2.反向解析语法

html页面上模板语法

{% url 'login_view' %}

后端语法

from django.shortcuts import  reverse
reverse('login_view')

六、动态解析之有名和无名分组解析

定义

由于动态改变的参数可以产生很多种情况,所有传具体的值,我们要提前在HTML和后端reverse中规定要传的值

  • 无名分组反向解析

1.路由匹配关系起别名

path(r'^index/(\d+)/', views.index, name='xxx')

2.动态反向解析语法
后端的反向解析

print(reverse('xxx', args=(122222, )))  # /index/  # 需要指定一个参数,这个参数必须符合正则表达式

前端的反向解析

<a href="{% url 'xxx' 222 333 %}">qqqqq</a>
  • 有名分组反向解析

1.路由匹配关系起别名

 path(r'^index/(?P<year>\d+)/', views.index, name='xxx')

2.动态反向解析语法
后端反向解析

print(reverse('xxx', kwargs={'year':2023}))

前端反向解析

<a href="{% url 'xxx' year=2023  %}"></a>

六、路由分发

定义

多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中,由于django项目可以有多个app应用,每一个App应用都可以有自己的路由文件,称为子路由。
image

  • 为什么要路由分发?
    1.当总路由中有非常多的路由时候,就会显得杂乱无章,我们这个时候就可以按照应用进行路由分发,把不同的路由写到对应的应用里面去,然后总路由文件做分发处理。
    2.django支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起。

创建两个app文件夹
子路由1:app01下面新建一个urls.py文件

from django.urls import path
from app01 import views

urlpatterns = [
    path('index01/',views.index)
]

子路由2:app02下面新建一个urls.py文件

from django.urls import path
from app01 import views

urlpatterns = [
    path('index02/',views.index)
]

总路由:

urlpatterns = [
	path('app01/', include('app01.urls'))
	path('app02/', include('app02.urls'))
]

ps: 路由中的后缀坚决不能加 $

django支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起

多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中

使用路由分发之前 总路由直接干路由与视图函数的匹配
	path('index/', index)
使用路由分发之后 总路由只按照应用名分配匹配方向
	path('app01/', include('app01.urls'))

名称空间

应用场景

路由分发之后 针对相同的别名能否自动反向解析出不同的应用前缀,默认情况下是无法直接识别应用前缀的,如果想要正常识别区分有两种方式

  • 方式1:名称空间

总路由

    path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
    path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
反向解析
     reverse('app01:index_view')
     reverse('app02:index_view')
  • 方式2:别名不冲突即可 (建议使用)

多个应用别名不冲突可以用应用名作为别名的前缀
子路由

      path('index/', views.index, name='app01_index_view')
      path('index/', views.index, name='app02_index_view')
反向解析
     reverse('app01_index_view')
     reverse('app02_index_view')