Django中间件理解

 

一、中间件

https://www.cnblogs.com/maple-shaw/articles/9333824.html

中间件:是一个类处理django的请求和响应,本质上就是一个类,在类里面定义几个方法。

django的生命周期:

  1.浏览器发送一个request请求 首先到达wsgiref

  2.然后到达url路由分发 url.py

  3. 根据url分发的地址找到view里面对应的CBV或者FBV

  4.CBV或者FBV会通过model去数据库里面查数据

  5.model拿到数据以后会返回一个对象给view,view获取到template文件进行渲染。

中间件的位置介于wsgi和url之间,很多请求前请求后都要走中间件,有的方法可以直接提取到中间件里面。

 

五个方法的参数执行的时间顺序以及返回值

process_request(self,request)
参数:跟属视图函数中的request是同一个
执行时间:在视图函数执行之前,也在路由匹配之前
执行顺序:按照中间价注册的顺序执行
返回值:None 返回none是正常流程
    如果返回一个HttpResponse对象 当前中间件之后的中间件的process_request路由
    匹配,视图函数都不执行,直接将结果返回给浏览器。

process_response(self,reqeust,respnse)
参数:request跟属视图函数中的request是同一个
   response:response对象
执行时间:视图函数执行之后
执行顺序:按照注册顺序倒序执行
返回值:必须返回response对象
如果在MD1里面的request方法里面返回一个HttpResponse 那就不会执行MD2里面的方法
执行完MD1的request以后执行MD1的response

process_view(self,request,view_func,view_args,view_kwargs)
参数:request和view中的request是一个
   view_func:执行函数
   vies_args:位置参数
   view_kwargs:关键字参数
执行时间:视图函数执行之前,也是在路由匹配之后
执行顺序:按照注册顺序执行
返回值:
  None:正常流程
  如果在MD1里面返回一个httpresponse对象,那么不会执行view视图以及MD2里面的MD2的view
  直接执行MD2里面的response 剩下的按照正常流程执行。


process_exception(self,request,exception)
参数:
  request:
  exception:错误对象
执行时间(触发条件):视图出错后才执行
执行顺序:按照注册顺序 倒序执行
返回值:None
    如果在MD2的execption中处理了异常,就不会执行MD1里面的exception,
    如果都没处理就直接交给django处理。


process_template_response(self,request,response)
  参数:
    request:跟视图中的request同一个
    response:template_repspnse对象
  执行时间(触发条件):必须返回一个template_repspnse对象才会执行
  执行顺序:倒序


代码如下:

middileware 中间件里面的代码

from django.utils.deprecation import MiddlewareMixin

class MD1(MiddlewareMixin):
    def process_request(self,request):
        print('MD1 process_request')

    def process_response(self,reqeust,respnse):
        return respnse

    def process_view(self,request,view_func,view_args,view_kwargs):
        print('MD1 process_view')

    def process_exception(self,request,exception):
        print('MD1 process_exception')

    def process_template_response(self,request,response):
        print('MD1 process_exception')
        response.template__name = 'index1.html'
        # response.context_data['name'] = 'Ivy Wang'
        return response


class MD2(MiddlewareMixin):
    def process_request(self,request):
        print('MD2 process_request')


    def process_response(self,reqeust,respnse):
        return respnse

    def process_view(self, request, view_func, view_args, view_kwargs):
        print('MD2 process_view')

    def process_exception(self,request,exception):
        print('MD2 process_exception')

    def process_template_response(self, request, response):
        print('MD2 process_exception')
        response.template_name = 'index1.html'
        response.context_data['name'] = 'Ivy Wang'
        return response

view里面的代码
from django.shortcuts import render,HttpResponse
from django.template.response import TemplateResponse
# Create your views here
def index(request):
    print('index')
    # return HttpResponse('index')
    return TemplateResponse(request,'index.html',{"name":"ivy"})

 

 

  

总结:

 1.浏览器发请求给wsgi后是一个request对象

 2.有了request对象后执行process_request方法

 3.执行完所有的request方法后执行urls路由匹配

 4.执行process_view

 5. 执行view函数,视图函数可以通过models操作数据库,也可以通过获取模板使用response的三个方法来渲染数据

 6.执行process_response对象然后交给wsgi,wsgi把数据变成浏览器认识的对象发给浏览器

 

posted @ 2019-08-05 17:35  ivy_wang  阅读(230)  评论(0编辑  收藏  举报