django路由匹配、反向解析、无名有名反向解析、路由分发、名称空间
django请求生命周期流程图
1.Django请求的生命周期的含义
Django请求的生命周期是指:当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情。
2.Django请求的生命周期图解及流程

1.浏览器默认市=是基于HTTP协议发送请求的
2.发送请求进入一个web服务网关接口,其实就是wsgiref(帮我们分装了socket代码,帮我们把请求过来的数进行数据处理,变成了一个大字典)它是Django默认的,但是它的并发能力特别低非常差,所以在Django上线之后都会切换为uwsgi,该服务并发能力强,并发量大
3.wsgiref与uwsgi都是属于WSG协议,它们俩个是实现这个协议的模块
4.请求进来的时候拆建数据,响应走的时候封装数据
------->进入了Django后端
1.首先会经过一个Django中间件,请求会经过它的层层筛选,才会进入urls.py
2.urls.py(路由层),进来之后完成一个地址的匹配,查看功能是否开设好了,如果开设好了就会进入views.py(视图层),执行核心逻辑,如果需要模板进入模板层
3.templates文件夹(模板层),models.py(模型层),模板层可能会需要用到模板语法,然后进入模型层拿取数据,用orm进入数据库操作数据,返回一个数据,然后orm会操作封装成对象,回到views.py层,然后会做一个模板渲染,最后依次返回

3.Django的请求生命周期(分布解析)
浏览器
发送请求(HTTP协议)
web服务网关接口
1.请求来的时候解析封装
响应走的时候打包处理
2.django默认的wsgiref模块不能承受高并发 最大只有1000左右
上线之后会替换成uwsgi来增加并发量
3.WSGI跟wsgiref和uwsgi是什么关系
WSGI是协议
wsgiref和uwsgi是实现该协议的功能模块
django后端
1.django中间件(暂时不考虑 后面讲)
类似于django的保安 门户
2.urls.py 路由层
识别路由匹配对应的视图函数
3.views.py 视图层
网站整体的业务逻辑
4.templates文件夹 模版层
网站所有的html文件
5.models.py 模型层
ORM
额外扩展:缓存数据库的作用
路由层
1.路由匹配
path('网址后缀',函数名)
一旦网址后缀匹配上了就会自动执行后面的函数
并结束整个路由的匹配
ps:ip和端口号后面必须要家斜杠的


不加/去请求访问的时候原理
首先它会去查看一遍有没有这个地址,然后发现没有,301是重定向的状态码,那么此时它会考虑给加一个/去重新执行一次,所有就有了俩次
路由结尾的斜杠
默认情况下不写斜杠 django会做二次处理
第一次匹配不上 会让浏览器加斜杠再次请求
django配置文件中可以指定是否自动添加斜杠
APPEND_SLASH = False(默认是True,改成false的时候,不加的话就不能访问到了)
2.path转换器
转换器只有在django2以上才会有
当网址后缀不固定的时候 可以使用转换器来匹配
'int': IntConverter(),
'path': PathConverter(),
'slug': SlugConverter(),
'str': StringConverter(),
'uuid': UUIDConverter(),
以后不知道固定的视图函数后面写什么就这么写:
path('func/<int:year>/<str:info>/', views.func)
转换器匹配到的内容会当做视图函数的关键字参数传入
转换器有几个叫什么名字 那么视图函数的形参必须对应
def func(request,year,info):
pass

在固定的路由后面添加些不确定的数

3.re_path正则匹配
re_path('test', views.test),
re_path('testadd', views.testadd),
输入网址:http://127.0.0.1:8000/testadd的时候,返回的是test的内容,re_path的特点是在我们输入的网址的后缀,它会去匹配,只要能匹配到这个后缀的,就算匹配上了
1.怎么去区分开呢??
re_path('test/', views.test),
re_path('testadd/', views.testadd),
加上/后它完整的是test/,所以它只能匹配到它自己的
2.但是还存在问题
http://127.0.0.1:8000/wfdrfffg/test/egddddddd/6ygg
这个样子还能匹配到,不太精准
那么如果想要使用正则去做匹配的话,在前面加上^,后面加上$
re_path('^test/$', views.test)
3.re_path(正则表达式,函数名)
一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数
并结束整个路由的匹配
当网址后缀不固定的时候 可以使用转换器来匹配
4.正则匹配之无名分组
re_path('^test/(\d+)/', views.test)
正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数
5.正则匹配之有名分组
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test)
正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
6.django版本区别
在django1.11中 只支持正则匹配 并且方法是 url()
django2,3,4中 path() re_path() 等价于 url()
反向解析
1.什么是反向解析
当路由频繁变化的时候,html界面与后端上的连接地址如何做到动态解析?
根据自己设置的一个别名,动态解析出一个结果,该结构可以直接访问对应的url
2.反向解析概念
通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
实现url路由频繁变化,html界面与后端动态解析连接地址操作步骤:
3.反向解析路由配置
1.先给路由与视图函数起一个别名
url(r'^func_kkk/',views.func,name='ooo') # name='ooo' 起别名
4.前后端反向解析
# 后端视图函数反向解析
1.导入模块reverse
from django.shortcuts import render,HttpResponse,redirect,reverse
2.反向解析 关键字 reverse('ooo')
def home(request):
print(reverse('ooo'))
return render(request,'home.html')
# 前端反向解析
3.前端模板文件反向解析
<a href="{% url 'ooo' %}">111</a>
5.无名有名反向解析
1.当路由出现无名有名分组反向解析需要传递额外的参数
2.无名有名分组反向解析,目的就是需要给一个参数,如果有多个就是需要手动的给多个,这多个参数一般情况都是当前操作数据的主键值。
path('reg/<str:info>/', views.reg, name='reg_view')
当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值
后端:
reverse('reg_view', args=('jason',))
前端:
{% url 'reg_view' 'jason' %}
ps:反向解析的操作三个方法都一样path() re_path() url()
路由分发
1.django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在项目名下urls.py(总路由层),很明显太冗余也不便于管理,这个时候也可以利用路由分发来减轻总路由的压力。
2.django的每一个应用(app)都可以有自己独立的urls.py路由器,static文件夹,templates文件夹。
3.基于上述特点,使用django做分组开发非常的简便。每个人只需要写自己的应用即可,互不干扰。最后由组长统一汇总到一个空的django项目中然后使用路由分发将多个应用关联在一起,即可完成大项目的拼接。

路由分发解决的就是项目的总路由匹配关系过多的情况
利用路由分发之后 总路由不再干路由与视图函数的直接对应关系
总路由而是做一个分发处理(识别当前url是属于那个应用下的 直接分发对应的应用去处理)
请求来了之后 总路由不做对应关系 只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理
提前创建好 应用app01 应用app02 然后记得注册
1.总路由配置
# 1.需要导入一个include路由分发模块
from django.conf.urls import url,include
# 2.导入子路由的uls(重名问题 起别名)
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
path('admin/', admin.site.urls),
# 1.路由分发
path('app01/',include(app01_urls)), # 只要url前缀是app01开头 全部交给app01下的urls处理
path('app02/',include(app02_urls)) # 只要url前缀是app02开头 全部交给app02下的urls处理
]


名称空间
当多个应用出现了相同的别名 我们研究反向解析会不会自动识别应用前缀
反向解析:正常情况下的反向解析是没有办法自动识别前缀的
解决 方式一:名称空间
# 总路由增加一个名称空间
path('app01/', include(('app01.urls', 'app01'), namespace='app01')), # 创建名称空间app01
path('app01/', include(('app01.urls', 'app02'), namespace='app02')), # 创建名称空间app02
# 子路由app01
urlpatterns = [
path('after/',views.after, name='after_view')
]
# 后端
def reg(request):
print(reverse('app01:after_view'))
return HttpResponse('下午好 from app01')
# 前端
{% url 'app01:after_view' %}
解决 方式二:起别名
# 子路由app01
urlpatterns = [
path('after/',views.after, name='app01_after_view')
]
# 后端
def reg(request):
print(reverse('app01_after_view'))
return HttpResponse('下午好 from app01')
# 前端
{% url 'app01:after_view' %}
1.其实只要保证名字不冲突 就没有必要使用名称空间
2.解决方法
一般情况下 有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能够确保多个app之间名字不冲突的问题
django路由匹配、反向解析、无名有名反向解析、路由分发、名称空间的更多相关文章
- Django url反向解析与路由分发名称空间
url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...
- Django框架路由分发-名称空间
目录 一:路由分发 1.路由分发简介 2.总路由分发配置 3.总路由终极配置(不需要导应用路由,直接点应用即可) 4.子路由配置 二:名称空间 1.名称空间应用场景 3.解决方式二>>&g ...
- Django学习——路由层之路由匹配、无名分组、有名分组、反向解析
路由层之路由匹配 """路由你可以看成就是出去ip和port之后的地址""" url()方法 1.第一个参数其实是一个正则表达式 2.一旦第 ...
- Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态
一.Django请求生命周期 二.路由层 urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- django路由匹配层
目录 orm表关系如何建立 一对多 多对多 一对一 django请求生命周期流程图 路由层 路由的简单配置 Django路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...
- ASP.NET Core MVC的路由参数中:exists后缀有什么作用,顺便谈谈路由匹配机制
我们在ASP.NET Core MVC中如果要启用Area功能,那么会看到在Startup类的Configure方法中是这么定义Area的路由的: app.UseMvc(routes => { ...
- ASP.NET Core 中的SEO优化(3):自定义路由匹配和生成
前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用: <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET ...
- [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]
[Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...
随机推荐
- 【Redis】集群数据迁移
Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384. 在集群节点对应的结构体变量clusterNode中可以看到s ...
- 不存在的!python说不给数据的浏览器是不存在的!
有时候我们些代码是总发此疑惑? 为什么别人采集 xx 网站的时候能成功,而我却总是不返回给数据出现这种原因时往往是我们没有给够伪装, 被识别了出来~ 就像人,你出门肯定是要穿衣服的对不,如果你不穿! ...
- 拉取服务器上的项目,svn认证失败
解决方案: 在服务器上找到对应的项目路径,并修改authz: 我的是因为[group]组下(下图中34行),我写的是[demo:/],改为[/]就可以了.
- identityserver4 (ids4)中如何获取refresh_token刷新令牌token 使用offline_access作用域
ids4默认自带的api接口/api/connect/token 调用这个接口的时候,需要在body里面的 x-www-form-urlencoded模式下写 { grant_type: &q ...
- SimpleDateFormat类介绍和 DateFormat类的format方法和parse方法
使用 SimpleDateFormat格式化日期 SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类.SimpleDateFormat 允许你选择任何用户自定义日期时间 ...
- HashMap源码深度剖析,手把手带你分析每一行代码,包会!!!
HashMap源码深度剖析,手把手带你分析每一行代码! 在前面的两篇文章哈希表的原理和200行代码带你写自己的HashMap(如果你阅读这篇文章感觉有点困难,可以先阅读这两篇文章)当中我们仔细谈到了哈 ...
- Git上传仓库
上传代码到gitee 方法1 1. 将远程仓库克隆到本地 git clone https://gitee.com/abc/aaa.git 2. 添加或修改本地文件 3. 将本地代码push到远程仓库 ...
- 以三元组表为存储结构实现矩阵相加(耿5.7)----------西工大 noj
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- LCA——树上倍增
首先,什么是LCA? LCA:最近公共祖先 祖先:从当前点到根节点所经过的点,包括他自己,都是这个点的祖先 A和B的公共祖先:同时是A,B两点的祖先的点 A和B的最近公共祖先:深度最大的A和B的公共祖 ...
- Linux中安装JDK详细步骤
一.下载Linux版本的JDK 进入官网下载对应的JDK,下载之前需要先登录 官网地址 -> https://www.oracle.com/ 登录成功后,找到对应的下载位置 根据自己电脑下载对应 ...