首页 > 其他分享 >Django之路由层 (有名和无名分组 反向解析 路由分发 名称空间)

Django之路由层 (有名和无名分组 反向解析 路由分发 名称空间)

时间:2023-04-25 19:57:15浏览次数:31  
标签:index 匹配 views Django 分组 app01 path 路由

目录

一、路由匹配

  • 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='转换器匹配到的类型转换之后的内容')

错误分析:
image
这里报错的原因是因为少接收了一个参数
image
转换匹配之后得到的内容要被视图函数接收到实参request后面,接收几个转换匹配的内容就要相对应传几个参数
image

三、正则匹配

定义

匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功会立刻停止路由层其他的匹配直接执行对应的视图函数
  • django2.X及以上版本有re_path 第一个参数是正则
    ps:用之前记得导入模块
    image
    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')

标签:index,匹配,views,Django,分组,app01,path,路由
From: https://www.cnblogs.com/nankeloveiu/p/17353347.html

相关文章

  • Django框架——路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、requ
    路由分发#Django支持每个应用都可以有自己独立的路由层、静态文件、模版层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起多个应用都有很多路由与视图函数的对应关系这个时候可以拆分到各自的路由层中使用路由分发之前总路由直接是路由与视图......
  • django打包成whl包并分发
    django打包成whl包并分发python中下载setuptools工具,打包成whl包结构公司内部写的包,只给公司内部使用,可以开源出来公司写好的项目,打包好,发送给客户,客户可以直接运行起来,不需要下载依赖注意:之前下载的第三包都是:requests-2.28.2-py3-none-any.whlwhl结尾的打包好的包,可以......
  • 仿Django框架-基于wsgiref模块和jinja2模块写一个简单的框架 主流框架简介 动静态网
    目录仿Django框架-基于wsgiref模块和jinja2模块写一个简单的框架一、前期需要的了解背景知识web框架的本质理解1:连接前端与数据库的中间介质理解2:socket服务端手写web框架的大概思路1.编写socket服务端代码2.浏览器访问响应无效>>>:HTTP协议3.根据网址后缀的不同获......
  • Django(五)
    Django(五)request对象#GETPOSTFILESmethodpathpath_infoget_full_path()bodydefindex(request):print(request.path)#/index/print(request.path_info)#/index/print(request.get_full_path_info())#接收路径的全部内容连参数也能拿到pr......
  • Django 如何使用 Celery 完成异步任务或定时任务
    以前版本的Celery需要一个单独的库(django-celery)才能与Django一起工作,但从Celery3.1开始,情况便不再如此,我们可以直接通过Celery库来完成在Django中的任务。安装Redis服务端以Docker安装为例,安装一个密码为mypassword的Redis服务端dockerrun-itd--name......
  • traceroute命令:网络诊断工具,它可以用于确定数据包从源主机到目标主机所需经过的路由器
    traceroute命令是一种网络诊断工具,它可以用于确定数据包从源主机到目标主机所需经过的路由器节点。traceroute通过发送UDP数据包或ICMPECHO请求,在数据包中设置递增的TTL(TimeToLive)值,每个TTL值代表距离源主机越来越远的路由器。当路由器收到TTL值为0的数据包时,将抛弃该数据包并......
  • pandas.DataFrame.groupby—使用映射器或通过一系列列对数据框进行分组
    语法格式DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=_NoDefault.no_default, squeeze=_NoDefault.no_default, observed=False, dropna=True)常用的几个参数解释:by:可接受映射、函数、标签或标签列表。用于确定分组。ax......
  • Vue2项目实战尚品汇 项目的路由分析
    视频5)路由的配置vue-router路由分为KVnode平台(并非语言)对于后台而言:K即为URL地址V即为相应的中间件http://localhost:8080/0607app.get("/0607",(res,req)=>{res.send('我是祖国的老花骨朵');});前端路由:K即为URL(网络资源定位符)V即为相应的路由组件5.1路由的一......
  • Python Django 制作商品列表展示
    新建名为goods应用pythonmanage.pystartappgoods修改chapter1/settings.py文件在INSTALLED_APPS数组中添加goods在对象TEMPLATES.OPTIONS中添加django.template.context_processors.media添加三个常量MEDIA_URL='/media/'MEDIA_ROOT=os.path.join(BASE......
  • drf-视图集、路由系统、action装饰器
    1.9个视图扩展类1.两个视图基类:APIView、GenricAPIView2.5个视图扩展类:CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,ListModelMixin,DestroyModelMixin3.9个视图子类:CreateAPIView,DestroyAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,ListCreateAPIView,......