Django的请求生命周期及每个周期的扩展内容

关于Django的生命周期我想大家都或多会少有一定的了解,下面我总结了一下每个周期的扩展内容,大家一起来看看吧!

先带大家看一张图吧!
​​​​​​Django的请求生命周期及每个周期的扩展内容_第1张图片
通过这张图相信都可以理解Django整个请求生命周期的整个流程以及各部分的作用了,那下面就说说我们每个生命周期更详细的知识点吧!

由浏览器发起请求开始

知识点1:
浏览器与服务器软件架构:C/S架构

HTTP协议:又称超文本传输协议,它规定了浏览器与服务端数据传输的格式

HTTP协议四大特性:

基于TCP/IP作用于应用层的协议

基于请求响应

无状态

无连接

知识点2:
请求格式及响应格式:

请求格式:

请求首行

请求头

空行(\r\n)

请求体

响应格式:

响应首行

响应头

空行

响应体

什么是wsgi(Web Server Gateway Interface) ?

wsgi:web服务网关协议(web服务网关接口)

实现该协议的模块:

  • wsgiref(测试版本,性能特别差)== JAVA中的tomcat
  • werkzurg
  • uwsig
wsgiref请求响应处理
知识点3:web服务网关协议

cgi:通用网关协议

wsgi协议:

wsgi协议(Web Server Gateway Interface) 主要包含server和application两部分:

WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;

WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序(执行程序),对应用程序来说,中间件扮演服务器(WSGI服务器)。

WSGI协议其实是定义了一种server与application解耦的规范,我们django自带的wsgiref是对该协议的具体实现

此外还有很多其他实现该协议的服务器:

uwsgi:支持较高并发,django项目上线一般会选择用它替换django自带的wsgiref == JAVA中的tomcat

wsgiref:支持并发不高,django自带

2、请求生命周期
  • wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)

    • 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session

    • 路由匹配

    • 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染

    • 中间件,对响应的数据进行处理。

    • wsgi,将响应的内容发送给浏览器。

4、视图

FBV
url - 函数

CBV
url - view

FBV(function base view)与CBV(class base view)本质是一样的,只是fbv基于函数,cbv基于类。只不过fbv较cbv往后多执行了几步

请求解析完成后依次通过Django中间件

知识点4:django中间件
什么是中间件?

官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。

说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项。

django自带七大中间件:可以简单理解为django的门户,安全认证及全局处理都在这里面

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

MIDDLEWARE配置项是一个列表(列表是有序的,记住这一点,后面你就知道为什么要强调有序二字),列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。

我们之前已经接触过一个csrf相关的中间件了?我们一开始让大家把他注释掉,再提交post请求的时候,就不会被forbidden了,后来学会使用csrf_token之后就不再注释这个中间件了。

除了django自带的中间件以外我们还可以自定义中间件实现一些全局的校验和配置

django暴露给开发者5种方法分别是:
process_request(self, request):   #请求来的时候执行

process_response(self, request, response):  #响应返回时执行

process_template_response(self, request, response)#视图函数执行完了执行

process_view(self, request, view_func, view_args, view_kwargs): #路由匹配成功后视图函数执行前执行

process_exception(self, request, exception): #视图函数出错时执行

接下来进入urls.py,路由匹配
知识点5:路由系统
urlpatterns = [
            url(r'^admin/', admin.site.urls),
            url(r'^$',views.home),
            url(r'^test/$',views.test),
            url(r'^testadd/$',views.testadd),
            url(r'',views.error)
        ]

①路由正则匹配

②无名分组

③有名分组

④反向解析

⑤路由分发

路由匹配成功,进入视图函数

知识点6:CBV/FBV

FBV

路由层写法:

   url(r'^test/$',views.test)

视图层写法:

def text(request):
    if request.method == "POST":
        return HttpResponse("ok")
    elif request.method == "GET":
        return HttpResponse("ok")

CBV

路由层写法:

 url(r'^test/$',views.Text.as_view()),

视图层写法:

from django.views import View
class Text(View):
    def get(self,request):
        return HttpResponse("ok")
    def post(self,request):
        return HttpResponse("ok")

三板斧及jsonresponse

from django.shortcuts import render,redirect,HttpResponse
from django.http import JsonResponse
视图函数处理数据,进行django模板渲染
知识点7:django模板层

①过滤器

②标签

③自定义过滤器、标签、inclusion_tag

④模板继承与导入

⑤静态文件配置

知识点8:django数据库操作:

①一对一、一对多、多对多表分析及创建

②多对多表三种创建方式

③django ORM增删改查、单表操作、多表操作

④F、Q查询

⑤ORM类、字段基础

⑥事务、批量插入、查询优化

表关系:https://www.cnblogs.com/dongxixi/p/10862974.html

多对多表三种创建方式:https://www.cnblogs.com/dongxixi/p/11042883.html

ORM增删改查:https://www.cnblogs.com/dongxixi/p/11013783.html

F、Q查询:https://www.cnblogs.com/dongxixi/p/11042869.html

ORM基础:https://www.cnblogs.com/dongxixi/p/11050753.html

django-model进阶:https://www.cnblogs.com/liuqingzheng/articles/9805991.html

你可能感兴趣的:(django,python)