当前位置: 首页 > news >正文

Django之路由匹配

Django请求生命周期

1.请求过程

        \bullet  浏览器客户端发起请求

        \bullet  数据经过web服务网关接口拆解数据

        \bullet  中间件处理请求

        \bullet  在路由层根据当前请求的URL找到对应的视图函数

        \bullet  在view视图层中进行业务处理(ORM处理数据先从数据库中拿到数据,处理好后再加载到template对应的页面中然后将数据返回)

        \bullet  再经过中间件处理返回响应

        \bullet  数据经过web服务网关接口对数据进行封装

        \bullet  在浏览器中展示

2.过程图解

 

路由匹配

1.什么是Django路由匹配

        根据用户请求的URL链接来判断对应的处理程序,并返回处理结果

\bullet  路由配置在urls.py文件中,每一条配置对应相应的处理方法。

\bullet  Django版本不同对应的urls.py配置也有点不一样

语法结构:

path("网址后缀",函数名)

2.结尾斜杠注意点

        在urls.py中定义网址后缀时默认可以不需要加"/"符,Django会进行二次处理:

第一次:直接用默认的查找

第二次:第一遍直接查找没有就会自动给你加上斜杠符再次去查询,如果还是没有那么就救不了你了

\bullet  当然我们也可以自己来设置是否需要自动帮你添加斜杠,在配置文件中加一行代码:

APPEND_SLASH = False

3.path转换器

        当查询网址后缀不固定的时候可以通过path转换器来匹配,path转换器有五种默认方法也支持自定义:

\bullet  str:匹配任何非空字符串,但不含斜杠(默认使用)

\bullet  int:匹配0和正整数,返回一个整型数据类型

\bullet  slug:匹配字母、数字、横杠以及下划线组成的字符串

\bullet  uuid:匹配格式化的uuid

\bullet  path:匹配任何非空字符串,包含斜杠

path('func/<int:year>/<str:info>',views.func)
'''转换器匹配到的内容会当做视图函数的关键字参数传入,
    且视图函数的形参必须与其对应'''
def func(request,year,info):
    pass

4.正则匹配

        当转换器用正则表达式捕获值的时候需要用:re_path(),而不是前面的path()

re_path('URL后缀/正则表达式',views.函数名)
'''当后缀中正则能匹配到内容就会自动执行后面的视图函数'''

4.1.正则匹配之无名分组

        正则匹配时也可以从后缀中匹配多个要求

re_path('URL后缀/正则表达式/',views.函数名)
'''正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数'''

4.2.正则匹配之有名分组

        可以给每一个正则匹配到的数据定义个名字

re_path('URL后缀/(?P<别名>正则表达式)/(?P<别名>正则表达式)/)'
'''匹配到的内容会起别名后当做视图函数的关键字参数传递给视图参数'''

小Tips:

        在Django1.11中 只支持正则匹配 并且方法是 url()

        在Django2,3,4版本中  path()  re_path() 等价于 url()

反向解析

1.什么是反向解析

        页面上的一些超链接、重定向等路由都是写死的,一旦路由发生变化则会导致所有页面相关链接失效,而反向解析就是用来防止出现该问题的。

2.反向解析使用

方式一:路由对应关系起别名

        在路由中给对应关系再取一个别名这样网页中使用时直接调用这个别名

路由层:
    path('后缀',views.视图函数,name='关系名')

方式二:使用反向解析语法

         html页面与后端都可以进行调用

html调用:
    {% url '关系名' %}

后端跳转调用:
    from django.shortcuts import reverse
    reverse('关系名')

ps:反向解析的操作三个方法都一样:path()、re_path()、url()

3.有名无名反向解析

        如果路由里面有不确定的因素那么在使用反向解析的时候必须人为传递数据,且有几个不确定因素就得穿几个值

eg:
    路由层:path('reg/<str:info>',views.reg, name='reg_view')
    模块层:reverse('reg_view',args=('aa'),)
    html页:{% url 'reg_view' 'aa' %}

路由分发

1.什么是路由分发

        当一个项目特别大的时候会有很多应用,这所有的应用的路由都写在项目文件内的urls.py文件内就会出现很多问题,同理还有static、templates文件夹。所以为了每个应用能够独立便于小组开发Django中的应用都可以有自己独立的这些文件,由项目的总路由来管理每个应用的子路由。

2.怎么实现

        在每个应用文件夹内都创建自己的子路由再由总路由来分发,当项目很大应用很多的时候使用路由分发非常的便于管理

总路由:
    path('app01/', include('app01.urls')),
    path('app02/', include('app02.urls')),

子路由:
    path('name/', views.name)
    path('name/', views.name)

总路由: path('应用对应的后缀', include('应用文件下的urls文件'))
子路由: path('后缀', 视图函数)

3.名称空间

        当多应用使用路由分发后应用与应用之间如果有名字冲突这时候再用反向解析时无法正常的解析

\bullet  解决方式一:

        默认规则再起别名的时候前面带个应用名,因为一个项目中应用名与应用名之间的名字是肯定不会冲突的

\bullet  解决方式二:

        总路由创建名称空间:namespace(复杂)

path('app01/',include(('app01.urls','app01'),namespace='app01'))
path('app02/',include(('app02.urls','app02'),namespace='app02'))

相关文章:

  • Java面试(四)JVM基础
  • 新学期,新FLAG
  • 一文详解C语言文件
  • Java实现的一个编译器源代码(Win11)
  • 内核调试:crash工具与vmcore实践
  • C++ Qt / VS2019 +opencv + onnxruntime 部署语义分割模型【经验】
  • 如何查看线程死锁
  • 代码源每日一题div2 可重排列
  • 【原创】基于Jsp+Servlet的仓库管理系统
  • 堡垒机部署
  • linux的man命令
  • 10 项目沟通管理
  • 三分钟了解JVM的垃圾回收和三色标记
  • MapStruct简单入门
  • Redis介绍、安装与初体验
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [Vue CLI 3] 配置解析之 css.extract
  • 【347天】每日项目总结系列085(2018.01.18)
  • Angular 2 DI - IoC DI - 1
  • java8 Stream Pipelines 浅析
  • java中具有继承关系的类及其对象初始化顺序
  • JS专题之继承
  • orm2 中文文档 3.1 模型属性
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue脚手架vue-cli
  • 程序员最讨厌的9句话,你可有补充?
  • 翻译:Hystrix - How To Use
  • 高度不固定时垂直居中
  • 关于Java中分层中遇到的一些问题
  • 前端面试总结(at, md)
  • 前端相关框架总和
  • 使用权重正则化较少模型过拟合
  • 数据可视化之 Sankey 桑基图的实现
  • 数组大概知多少
  • ###C语言程序设计-----C语言学习(3)#
  • #git 撤消对文件的更改
  • #pragam once 和 #ifndef 预编译头
  • #微信小程序(布局、渲染层基础知识)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三) diretfbrc详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET程序员迈向卓越的必由之路
  • .Net各种迷惑命名解释
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @Autowired标签与 @Resource标签 的区别
  • [\u4e00-\u9fa5] //匹配中文字符
  • [3D基础]理解计算机3D图形学中的坐标系变换