• 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把数据变成浏览器认识的对象发给浏览器

    We are down, but not beaten. tested but not defeated.
  • 相关阅读:
    0909我眼中的编译原理
    你要的所有数据源都在这里了!
    JAVA多线程和并发基础
    写的代码小有成就+今日总结--购买产品---20200508
    mysql数据库时区问题
    【Spring】——声明式事务配置详解
    SpringBoot整合阿里云OSS文件上传、下载、查看、删除
    一文看懂:网址,URL,域名,IP地址,DNS,域名解析
    git快速入门
    批处理框架spring batch基础知识介绍
  • 原文地址:https://www.cnblogs.com/guniang/p/11304396.html
Copyright © 2020-2023  润新知