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

 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)  # app01path('after/', views.after)  # app02

总结include

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

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

这句话的意思就是说

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

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

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

 

名称空间

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

  解决方式1

namespacepath('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.hqwc.cn/news/480002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉搜索树——迭代实现

———————————————————— 普通的树形结构中数据是杂乱无章的&#xff0c;实际意义不大&#xff0c;要想更好的管理数据&#xff0c;需要让数据有序&#xff0c;二叉搜索树又称二叉排序树&#xff0c;是一种特殊的树形结构。 规定一般的二叉搜索树的左节点小于…

四旋翼无人机控制-零散笔记整理

四旋翼无人机控制-零散笔记整理 说明仿真框架 说明 这是低创文章&#xff0c;本意是整理本科留下来的一堆零碎的纸质笔记&#xff0c;整理完就把纸质的扔了。所以前后不连贯&#xff0c;也可能有错误&#xff0c;图片都是直接拍的笔记照片&#xff0c;很丑。如果想系统学习的可…

【MySQL】Navicat/SQLyog连接Ubuntu中的数据库(MySQL)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、安装…

基于vue的个性化推荐餐饮系统Springboot

项目&#xff1a;基于vue的个性化推荐餐饮系统Springboot 摘要 现代信息化社会下的数据管理对活动的重要性越来越为明显&#xff0c;人们出门可以通过网络进行交流、信息咨询、查询等操作。网络化生活对人们通过网上购物也有了非常大的考验&#xff0c;通过网上进行点餐的人也…

Stable Diffusion 绘画入门教程(webui)

文章目录 一、前言二、做出的效果三、SD使用流程1、大模型2、关键字3、调参数 一、前言 随着mj和sd绘画软件发布之后&#xff0c;AI绘画开始爆火&#xff0c;很多小伙伴已经挖掘出很多的玩法&#xff0c;哪怕最基础的AI美女、AI壁纸、真人漫改等等都赚的盆满钵满&#xff0c;当…

HTML学习笔记——08:表单<form>

HTML <form> 元素表示文档中的一个区域&#xff0c;此区域包含交互控件&#xff0c;用于向 Web 服务器提交信息。 例如&#xff1a;登录页面。 作用&#xff1a;搜集不同类型的用户输入&#xff0c;并向服务器传送数据。 注意&#xff1a;表单本身并不可见&#xff01;…

CMake的简单使用

一、一个最简单的CMake项目 在Ubuntu上使用CMake构建一个最简单的项目。 1. 安装CMake 首先安装CMake&#xff0c;这里使用的是Ubuntu系统。 sudo apt-get install cmake2. 编写源程序 编写代码&#xff0c;新建文件main.c。 // main.c #include "stdio.h"int …

Spring Boot应用集成Actuator组件以后怎么自定义端点暴露信息

一、 前言 在平时业务开发中&#xff0c;我们往往会在spring Boot项目中集成Actuator组件进行系统监控&#xff0c;虽然Actuator组件暴露的端点信息已经足够丰富了&#xff0c;但是特殊场景下&#xff0c;我们也需要自己暴露端点信息&#xff0c;此时应该怎么操作呢&#xff1…

智能运维乱象有哪些?智能运维业务包括哪些

在实施智能运维过程中可能遇到的乱象及其原因&#xff0c;系统地阐述智能运维业务所涵盖的各个方面&#xff0c;包括但不限于预防性维护、故障检测与诊断、自动化修复以及持续的性能优化等关键组成部分。 实施智能运维过程中可能遇到的乱象及原因包括&#xff1a; 数据不一致或…

qt-交通路口仿真

qt-交通路口仿真 一、演示效果二、核心代码三、程序链接 一、演示效果 二、核心代码 #include "generator.h"Generator::Generator(SimulationScene *scene):m_scene(scene),m_mode(VEHICLEMETHOD::GO_THROUGH),m_running_state(false),m_VisionOn(false),m_IsInter…

※【回溯】【深度优先前序】Leetcode 257. 二叉树的所有路径

※【回溯】【深度优先前序】Leetcode 257. 二叉树的所有路径 解法0 迭代法解法1 深度优先 前序解法2 深度优先 前序 添加了StringBulider ---------------&#x1f388;&#x1f388;257. 二叉树的所有路径 题目链接&#x1f388;&#x1f388;------------------- 解法0 迭代法…

SpringAop是什么?

简单介绍&#xff1a; AOP&#xff1a;Aspect Oriented Programming (面向切面编程、面向方面编程)&#xff0c;其实就是面向特定方法编程。 场景&#xff1a; 比如现在有一个需求&#xff0c;我要统计每一个业务方法的耗时时长&#xff0c; 我们只需在业务方法的前面获取一个…