zoukankan      html  css  js  c++  java
  • Django之中间件

    一:中间件基础简介

    (1)简介:

      (1)中间件是在视图函数执行之前与执行之后可以进行的一些额外操作

      (2)其本质是一个自定义的类 类中定义了几个方法 其会在特定的条件触发这些方法

    (2)作用:

      (1):django中间件 可以用来进行身份校验 访问频率限制 权限校验

      (2):只要涉及全局校验都可以使用中间件进行校验 

    (3)django默认中间件

    (1)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',
    ]
    Django默认中间件

    (4)django请求生命周期

     PS:

      (1)上述当客户端的请求到达中间件的时候 其首先会查找缓存数据库

      (2)如果缓存数据库查找不到 最终到达数据库查找

      (3)当数据库将查找的数据返回 经过中间件的时候 其会将数据分成两份

      (4)一份存入缓存数据库中 一份传输给客户端

      (5)下次客户端再次获取相同的数据的时候 其不会在进行数据库查询 而是直接去缓存数据库查询

    二:自定义中间件

    (1)常见自定义方法

      (1)process_request(self,request)

      (2)process_view(self, request, view_func, view_args, view_kwargs)

      (3)process_template_response(self,request,response)

      (4)process_exception(self, request, exception)

      (5)process_response(self, request, response)

    (2)自定义方法使用示例

    (1)文件创建图解

    from django.utils.deprecation import MiddlewareMixin
    
    
    class MyMiddleWareM1(MiddlewareMixin):
        pass
    
    
    class MyMiddleWareM2(MiddlewareMixin):
        pass
    
    class MyMiddleWareM3(MiddlewareMixin):
        pass
    中间件自定义方法

    (2)process_request

    from django.utils.deprecation import MiddlewareMixin
    
    
    class MyMiddleWareM1(MiddlewareMixin):
        def process_request(self, request):
            print('我是第一个自定义中间件中的 request方法')
    
    
    class MyMiddleWareM2(MiddlewareMixin):
        def process_request(self, request):
            print('我是第一个自定义中间件中的 request方法')
    
    
    class MyMiddleWareM3(MiddlewareMixin):
        def process_request(self, request):
            print('我是第一个自定义中间件中的 request方法')
    中间件
    def index(request):
        print('index 视图函数')
        return HttpResponse('index 视图函数')

     PS:

      (1)请求来的时候 会在中间件列表中从上至下依次进行 最后走视图函数

     

     PS:

      (1)一旦遇到中间件返回值为HttpResponse对象的时候 就不会再继续往下执行别的中间件

      (2)前端收到的返回值 也是为中间件的返回值 而不是后端视图函数的返回值

    (3)process_response

    class MyMdd(MiddlewareMixin):
       
        def process_response(self, request, response):
            print('我是第一个中间件里面的process_response方法')
    
    
    class MyMdd1(MiddlewareMixin):
    
        def process_response(self, request, response):
            print('我是第二个中间件里面的process_response方法')
    
    
    class MyMdd2(MiddlewareMixin):
    
        def process_response(self, request, response):
            print('我是第三个中间件里面的process_response方法')
    中间件

     PS:

      (1)中间件必须将response返回

      (2)response包含 后端给前端返回的消息格式

     PS:

      (1)后端进行相应的时候 中间件执行顺序 为中间件列表从下往上开始执行

    (4)process_view

    class MyMdd(MiddlewareMixin):
        def process_view(self, request, view_func, view_args, view_kwargs):
            print('我是第一个中间件里面的process_view方法')
    
    class MyMdd1(MiddlewareMixin):
        def process_view(self, request, view_func, view_args, view_kwargs):
            print('我是第二个中间件里面的process_viewe方法')
    
    
    class MyMdd2(MiddlewareMixin):
        def process_view(self, request, view_func, view_args, view_kwargs):
            print('我是第三个中间件里面的process_view方法')
    中间件

     PS:

      (1)其会在执行视图函数之前触发该方法

      (2)在触发该方法的时候 会拿到后端视图函数的内存地址

    (5)process_exception

    class MyMdd(MiddlewareMixin):
        def process_exception(self, request, exception):
            print(exception)  # name 'asdasdasd' is not defined
            print('我是第一个中间件里面的process_exception方法')
    
    
    class MyMdd1(MiddlewareMixin):
        def process_exception(self, request, exception):
            print('我是第二个中间件里面的process_exception方法')
    
    
    class MyMdd2(MiddlewareMixin):
        def process_exception(self, request, exception):
            print('我是第三个中间件里面的process_exception方法')
    中间件
    def index(request):
        print('index 视图函数')
        asdasdasd
        return HttpResponse('index 视图函数')
    # 结果展示
    index 视图函数
      
    我是第三个中间件里面的process_exception方法
        
    我是第二个中间件里面的process_exception方法
     
    name 'asdasdasd' is not defined
    我是第一个中间件里面的process_exception方法

    PS:

      (1)其会在后端代码运行错误的时候触发该方法运行

      (2)中间件执行顺序 在中间件列表自上而下执行

    (6)process_template_response

    def index(request):
        print('我是index视图函数')
    
        def render():
            return HttpResponse('什么鬼玩意')
    
        obj = HttpResponse('index')
        obj.render = render
        return obj

    PS:

      (1)当你返回的HttpResponse对象中必须包含render属性才会触发

  • 相关阅读:
    Power of Cryptography(用double的泰勒公式可行分析)
    Radar Installation(贪心)
    The Pilots Brothers' refrigerator(dfs)
    Flip Game(dfs)
    Connect the Cities(MST prim)
    Constructing Roads (MST)
    suoi16 随机合并试卷 (dp)
    suoi14 子树查找 (dfs)
    nowcoder106I Neat Tree (单调栈)
    luogu2296 [NOIp2014]寻找道路 (bfs)
  • 原文地址:https://www.cnblogs.com/SR-Program/p/11586753.html
Copyright © 2011-2022 走看看