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路由匹配、反向解析、无名有名反向解析、路由分发、名称空间的更多相关文章

  1. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

  2. Django框架路由分发-名称空间

    目录 一:路由分发 1.路由分发简介 2.总路由分发配置 3.总路由终极配置(不需要导应用路由,直接点应用即可) 4.子路由配置 二:名称空间 1.名称空间应用场景 3.解决方式二>>&g ...

  3. Django学习——路由层之路由匹配、无名分组、有名分组、反向解析

    路由层之路由匹配 """路由你可以看成就是出去ip和port之后的地址""" url()方法 1.第一个参数其实是一个正则表达式 2.一旦第 ...

  4. Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态

    一.Django请求生命周期 二.路由层  urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...

  5. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  6. django路由匹配层

    目录 orm表关系如何建立 一对多 多对多 一对一 django请求生命周期流程图 路由层 路由的简单配置 Django路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...

  7. ASP.NET Core MVC的路由参数中:exists后缀有什么作用,顺便谈谈路由匹配机制

    我们在ASP.NET Core MVC中如果要启用Area功能,那么会看到在Startup类的Configure方法中是这么定义Area的路由的: app.UseMvc(routes => { ...

  8. ASP.NET Core 中的SEO优化(3):自定义路由匹配和生成

    前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用: <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET ...

  9. [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]

    [Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...

随机推荐

  1. Aeraki Mesh正式成为CNCF沙箱项目,腾讯云携伙伴加速服务网格成熟商用

    6月,由腾讯云主导,联合百度.灵雀云.腾讯音乐.滴滴.政采云等多家合作伙伴发起的服务网格开源项目 Aeraki Mesh 通过了全球顶级开源基金会云原生计算基金会(CNCF)技术监督委员会评定,正式成 ...

  2. SAP创建XML 文件

    TYPES: BEGIN OF xml_line_type, data(256) TYPE x, END OF xml_line_type, xml_tab_type TYPE TABLE OF xm ...

  3. bat-注册表

    注册表 注册表就像于是配置文件 linux下一切皆文件,windows下一切皆注册表 注册表(各种配置文件:系统设置.用户设置.软件的配置) HKEY_CLASSES_ROOT     超级管理员.系 ...

  4. Wabacus框架中inputbox和datepicker实现时间日历

    前提是要引入WdatePicker.js. 一.年月日时分秒(中文) <inputbox type="datepicker" inputboxparams="dat ...

  5. 皮尔逊(Pearson)系数矩阵——numpy

    一.原理 注意 专有名词.(例如:极高相关) 二.代码 import numpy as np f = open('../file/Pearson.csv', encoding='utf-8') dat ...

  6. Conversation Modeling on Reddit Using a Graph-Structured LSTM

    publish: Transactions of the Association for Computational Linguistics,2016 tasks:  predicting popul ...

  7. 网络通讯之Socket-Tcp(二)

    网络通讯之Socket-Tcp  分成2部分讲解: 网络通讯之Socket-Tcp(一): 1.如何理解Socket 2.Socket通信重要函数 3.Socket Tcp 调用的基本流程图 4.简单 ...

  8. jdbc 10:jdbc事务

    jdbc连接mysql,涉及到的事务问题 package com.examples.jdbc.o10_jdbc事务; import java.sql.Connection; import java.s ...

  9. 题解 洛谷 P2388 阶乘之乘

    目录 简要题意 题解 主要思路 一个 \(\omega(n)\) 的算法 一个 \(O(\log n)\) 的算法 一个算法 代码 算法 \(1\)(\(\omega(n)\)) 算法 \(2\) 算 ...

  10. docker for windows无法共享硬盘

    最近在一次win10安装docker的过程中无法共享D盘.每次一点击共享就出现如下 经过网上搜索后,有反馈是防火墙的问题,结果关掉防火墙还是无法改善,查找日志 因为无法判断是什么server服务,故又 ...