django请求生命周期流程图,路由匹配,路由有名无名反向解析,路由分发,名称空间

news2025/1/11 9:08:14

 django请求生命周期流程图

浏览器发起请求。

先经过网关接口,Django自带的是wsgiref,请求来的时候解析封装,响应走的时候打包处理,这个wsgiref模块本身能够支持的并发量很少,最多1000左右,上线之后会换成uwsgi,并且还会加nginx。  

往后就到Django框架了,先经过中间件,中间件处理请求。

再到路由层做路由匹配和分发。

然后到视图层进行业务处理,ORM处理数据,从数据库取到数据返回给视图层,在模板层进行数据渲染,返回数据。

中间件处理响应。WSGI返回响应,浏览器进行渲染。

路由匹配

路由匹配就是在django项目中,建立的urls文件中的urlpatterns里面的path,我们可以称之为对应关系,每一个path都是一组对应关系,下面我们就来深入探讨路由匹配

基本格式

  path('网址后缀',函数名)    # 这里的函数名可以是我们在views文件中的函数名也可以是models中的类名

  当网址后缀匹配成功,后面的函数名就会自动执行

路由结尾的斜杠(django二次确认机制)

  eg:   path('home/',views.home)

  我们在html页面中访问的时候后缀一般不都是/home/嘛,那我们觉得输入/home是会报错的吧?

  但是django很牛逼,它会自动给我们做一个二次处理,如果第一次没有匹配上,会让浏览器加上斜杠再次请求

  你看嘛↓      牛逼吧

  django配置文件中也可以指定是否自动添加斜杠   

    APPEND_SLASH = False       正常人我估计是不会去用它的

path转换器

  当我们网址后缀不固定的时候   可以使用转换器来匹配

  语法:  path('func/<int:year>/<str:info>/', views.func)

    1.转换器匹配到的内容会当做视图函数的关键字参数传入

    2.在这里<int:year>   <str:info>他们是两个关键字参数

    3.转换器有几个叫什么名字 那么视图函数的形参必须对应

      def func(request,year,info):
          pass

主要有以下几个转换器     常用的有  int  str

'int': IntConverter(),
'path': PathConverter(),
'slug': SlugConverter(),
'str': StringConverter(),
'uuid': UUIDConverter(),

re_path正则匹配

  首先需要在urls中导一个模块  from django.urls import path,re_path

  用法:re_path(正则表达式,函数名)

  一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数,并结束整个路由的匹配

  eg:    re_path('^index/$', views.index)

你看,你看   我这里用的是正则

                            

  当网址后缀不固定的时候 可以使用转换器来匹配 

正则匹配之无名分组

  在正则表达式中我们的分组就是给正则表达式加上括号,其实在这里也一样

  re_path('^index/(\d+)/', views.index)   可以设置多个分组后缀

  但是,在这里分组后正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数

  所以在视图函数中我们还要加上一个位置参数

正则匹配之有名分组

  理论上来讲有名分组和无名分组是差不多的,区别在于有名分组要给正则表达式起别名

  re_path('^index/(?P<year>\d+)/(?P<others>.*?)/', views.index)

  正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数 

你来看,

 

django版本区别

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

  django2,3,4中  path()  re_path() 等价于 url()

路由反向解析  

  我们在写路由(就是urls中的对应关系)的时候,很容易把路由写死,一旦路由发生变化会导致所有页面相关链接失效

  这可咋办???

  这个时候就要用到我们的反向解析

  那什么是反向解析:

    返回一个结果 该结果可以访问到对应的路由

  语法:

     1. 路由对应关系起别名    我通过这个别名就能找到对应的页面

        path('reg/', views.register, name='register_view')

     2. 使用反向解析语法html页面

        <a>{% url 'reg_view' %}</a>

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

come look     贼好用

           

补充一下   reverse  

这个东西可以帮我们解析出当前访问的是哪个路由

 

无名有名反向解析

   这个时候我们再来研究一个问题

假设我们刚才的路由后缀后面还跟着一个东西<str: info>/

  path('regfa/<str:info>/',views.register, name='register_view')

我们知道<str: info>/这个东西可以接收任意的字符串,

这个时候我们再去访问home.html会报这个错误

 就是说它解析不了这个路由,有点垃圾

   但是,我们可以通过人为的方式进行修改,就是说路由中如果有不确定的数据,那么反向解析需要人为的方式传递数据

 不想写了直接看图吧,兄弟们

同时,在我们的前端页面也要进行修改

其实,到这里我们肯定还有疑惑,

我懂你,上面给定的字符串啦等不是随意的,是根据你将来执行什么样的业务就起什么样的参数名,没办法,只能这样了

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

路由分发

我们知道django中的应用都可以有自己独立的      我们也可以将他看作开发目录规范

  eg:     urls.py   templates文件夹    static文件夹

    能够让基于django开发的多个应用完全独立 便于小组开发

同样的我们针对路由也应该划分总路由和子路由

总路由盒子路由的功能示意图及流程

下面创建app    (用到startapp app名 这个命令)

 

                         

 创建完app别忘了在settings中注册一下      这很重要     相信我

 

之后再在总路由的urls中分发路由的给各个app的urls并且每个app中的urls你都要写一下app中的一些路由

                

总路由
	 path('app01/', include('app01.urls')),
    path('app02/', include('app02.urls')),
子路由
	 path('after/', views.after)  # app01
    path('after/', views.after)  # app02

总结include

我们把总路由中的分配路由这句话单独拿出来看

 path('app01/', include('app01.urls'))

这句话的意思就是说

  1.总路由先拿到访问的地址的全部的后缀名,判断第一个后缀名是不是在这个项目中,

  2. 如果在那么他就会把app01/后面的后缀名传到app01的urls中

  3. app01的urls拿到总路由传来的后缀名再次判断该执行那个功能

 

名称空间

  有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析

  解决方式1

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

解决方式2
    别名不冲突即可(用这个用这个用这个!!!!!)

  app01_你的路由

在app的urls中要写上

  app:     path('after/', views.after, name='app01_after_view')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis(十四)双写一致性工程案例

文章目录 问题概述canal功能安装部署mysql配置canal服务端canal客户端&#xff08;Java程序&#xff09; 问题概述 canal https://github.com/alibaba/canal 功能 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据…

springboot当中使用EMQX(MQTT协议)

本篇博客主要围绕EMQX是什么&#xff1f;、能干什么&#xff1f;、怎么用&#xff1f; 三点来进行整理。 1、MQTT协议 1.1、MQTT简介 在了解EMQX前首先了解一下MQTT协议&#xff0c;MQTT 全称为 Message Queuing Telemetry Transport&#xff08;消息队列遥测传输&#xff0…

IDEA查询对应功能的快捷键

首先要知道快捷键的key叫什么&#xff0c;然后通过key来找到对应的快捷键 比如下面这个查找删除导入未使用的类 跳转 或者安装对应插件

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、…

【Docker】docker常用命令

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、镜像仓库架构图 二、docker仓库命令 1、登录仓库docker login 2、拉取镜像docker pull 3、推送镜像docker pus…

TOUCHDESIGNER(1-2) 元件

元件来了 一级 二级 三级!!!

Git 客户端可视化工具tortoisegit

Git 使用教程 git一点通 (kdocs.cn) 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网 https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建…

说一下JVM类加载机制?

Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。 在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都是隐式装载的&#xff0c;除非我们有特殊…

Python学习-数字类型、布尔类型

八、数字类型 1、整数&#xff08;integers&#xff09; Python的除法就算能被整除&#xff0c;也会产生带小数的结果。小数在Python中是以浮点数的形式存在的。 比如&#xff1a; >>>6/2 3.02、浮点数&#xff08;floating point numbers&#xff09; Python的浮…

排序算法之——直接插入排序

直接插入排序——以升序排列为例 1.1基本思想1.2动态图示感知1.3静态图示详解1.4代码实现1.5时间复杂度1.5.1最好情况1.5.2最差情况 1.6空间复杂度1.7稳定性1.7.1一个小问题 1.1基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直…

鸿蒙小案例-五子棋

鸿蒙小案例-五子棋 1.准备组件(组件布局) 2.下棋功能实现 3.机器人下棋功能实现 4.赢棋功能实现 5.附属功能实现刚开始以为挺简单的&#xff0c;越写越…emo 因为代码有点多&#xff0c;所以这里就简单讲下逻辑&#xff0c;文末贴上代码 逻辑只是我个人想的&#xff0c;不代…

Learn HTML in 1 hour

website address https://www.youtube.com/watch?vHD13eq_Pmp8 excerpt All right, what’s going on? everybody. It’s your Bro, hope you’re doing well, and in this video I’m going to help you started with html; so sit back, relax and enjoy the show. If y…

ABAP 导入Excel表示例程序

目录 ABAP 导入excel示例程序创建程序使用的结构上传下载模板 ABAP 导入excel示例程序 批量导入程序&#xff0c;需要使用到导入模板&#xff0c;首先需要创建程序&#xff0c;之后是需要创建excel导入模板&#xff0c;并且需要将excel导入模板上传到SAP系统里面&#xff0c;之…

【linux】查看openssl程序的安装情况

【linux】查看openssl程序的安装情况 1、查看安装包信息 $ rpm -qa |grep openssl 2、安装路径 $ rpm -ql openssl $ rpm -ql openssl-libs $ rpm -ql openssl-devel 3、相关文件和目录 /usr/bin/openssl /usr/include/openssl /usr/lib64/libssl.so.* /usr/lib64/libcrypto…

idea自动导包。已经无用导包自动移除

1.setting中勾选这两项&#xff0c;然后点击apply即可

【DDD】学习笔记-薪资管理系统的场景驱动设计

场景驱动设计的起点是领域场景&#xff0c;它不一定需要与事件风暴结合&#xff0c;只要识别并确定了领域场景&#xff0c;就可以进行任务分解。每个分解出来的子任务都可以视为是职责。分配职责时&#xff0c;场景驱动设计规定了履行职责的角色构造型&#xff0c;其中&#xf…

MongoDB 权限管理

文章目录 前言1. 权限控制1.1 MongoDB 默认角色1.1.1 读写角色1.1.2 管理角色1.1.3 其他角色1.1.4 超级用户角色 1.2 用户管理1.2.1 查看用户1.2.2 创建新用户1.2.3 调整角色1.2.4 删除用户1.2.4 修改密码 前言 上一篇 《MongoDB 单机安装部署》 文章中&#xff0c;为 MongoDB…

[SwiftUI]启动页LaunchScreen.storyboard中适配状态栏加安全区域的高度

如下图&#xff0c;我有一个需求。在启动页&#xff08;LaunchScreen.storyboard&#xff09;和引导页&#xff08;GuideView&#xff09;的黑色背景上&#xff0c;使用了同一张正方形图片。要求从启动页切换到引导页时&#xff0c;这两张相同的图片的过渡要无缝衔接&#xff0…

三防加固平板在房地产行业的应用|亿道三防onerugged

近期&#xff0c;有一款引人注目的解决方案——亿道三防onerugged平板电脑&#xff0c;它以其出色的性能和多功能的设计&#xff0c;为房地产行业带来了全新的应用体验。 首先&#xff0c;亿道三防onerugged平板电脑的NFC功能在小区业主身份验证中发挥着重要作用。传统的身份验…

Spring Boot项目中TaskDecorator的应用实践

一、前言 TaskDecorator是一个执行回调方法的装饰器&#xff0c;主要应用于传递上下文&#xff0c;或者提供任务的监控/统计信息&#xff0c;可以用于处理子线程与主线程间数据传递的问题。 二、开发示例 1.自定义TaskDecorator import org.springframework.core.task.Task…