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

    什么是中间件

      中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

    中间件实现的功能

      1.用户认证

      2.日志记录

      3.跨站请求(csrf_token,对所有的post请求都做了验证)

      4.Session

      5.权限管理

    中间件的组成部分

       process_request

          当客户端发起Request请求,首先经过每个中间件的process_request方法,通过路由系统,最后才访问视图。

       process_response

          视图函访问之后,此时执行Response过程,依次通过每个中间件的process_response方法,最后把结果返回给客户端。

        

        从上面的图示可以看出,在Request请求的时候,依次执行的是每个中间件的process_request方法,当访问完视图函数之后,首先执行最后一个中间件的process_response方法,然后一次执行至第一个中间件的process_response方法,最终返回给浏览器。因此放在前面的中间件会先被执行,放在后面的中间件会靠后执行。

    自定义中间件

        创建步骤

          1.导入MiddlewareMixin类。from django.utils.deprecation import MiddlewareMixin

          2.在App中自定义一个文件夹,在该文件夹中创建.py文件。

          3.在项目的Settings.py文件中注册自定义的中间件。格式: App名称.文件夹名称.py文件名.类名

    代码示例:

     1 from django.utils.deprecation import MiddlewareMixin
     2 from django.shortcuts import HttpResponse
     3 
     4 
     5 class M1(MiddlewareMixin):
     6     def process_request(self,request):
     7         print("中间件1请求")
     8 
     9     def process_response(self,request,response):
    10         print("中间件1返回")
    11         return response
    12 
    13 
    14 class M2(MiddlewareMixin):
    15     def process_request(self,request):
    16         print("中间件2请求")
    17         # return HttpResponse("走")
    18 
    19     def process_response(self,request,response):
    20         print("中间件2返回")
    21         return response
    22 
    23 
    24 class M3(MiddlewareMixin):
    25     def process_request(self,request):
    26         print("中间件3请求")
    27 
    28     def process_response(self,request,response):
    29         print("中间件3返回")
    30         return response
    31 #Settings.py部分
    32 MIDDLEWARE = [
    33     'django.middleware.security.SecurityMiddleware',
    34     'django.contrib.sessions.middleware.SessionMiddleware',
    35     'django.middleware.common.CommonMiddleware',
    36     'django.middleware.csrf.CsrfViewMiddleware',
    37     'django.contrib.auth.middleware.AuthenticationMiddleware',
    38     'django.contrib.messages.middleware.MessageMiddleware',
    39     'django.middleware.clickjacking.XFrameOptionsMiddleware',
    40     'cmdb.middle.m1.M1',
    41     'cmdb.middle.m1.M2',
    42     'cmdb.middle.m1.M3',
    43 ]

    执行结果:

        当中间件的process_request出现return时

    执行过程:

    执行结果:

        结论

          当中间件中的process_request方法有返回值时,此时会将该返回值返回给本中间件的process_response方法,不再执行以后的中间件,至此返回。

        当中间件中含有process_view方法时

    代码做如下修改:

     1 from django.utils.deprecation import MiddlewareMixin
     2 from django.shortcuts import HttpResponse
     3 
     4 
     5 class M1(MiddlewareMixin):
     6     def process_request(self,request):
     7         print("中间件1请求")
     8 
     9     def process_response(self,request,response):
    10         print("中间件1返回")
    11         return response
    12 
    13     def process_view(self, request, callback, callback_args, callback_kwargs):
    14         print("中间件1view")
    15 
    16 
    17 class M2(MiddlewareMixin):
    18     def process_request(self,request):
    19         print("中间件2请求")
    20         # return HttpResponse("")
    21 
    22     def process_response(self,request,response):
    23         print("中间件2返回")
    24         return response
    25 
    26     def process_view(self, request, callback, callback_args, callback_kwargs):
    27         print("中间件2view")
    28 
    29 
    30 class M3(MiddlewareMixin):
    31     def process_request(self,request):
    32         print("中间件3请求")
    33 
    34     def process_response(self,request,response):
    35         print("中间件3返回")
    36         return response
    37 
    38     def process_view(self, request, callback, callback_args, callback_kwargs):
    39         print("中间件3view")

    执行结果:

    执行过程:

        结论

          当执行完所有中间件的Request后,进入路由系统,此时在process_view的参数中保存要访问的视图函数URL,然后依次执行各个中间价的process_view方法,之后执行view视图函数,最后一次通过每个中间件的process_response方法。

  • 相关阅读:
    录制游戏视频——fraps
    ssh 带端口登录
    You have new mail in /var/spool/mail/root 烦不烦你?
    php生成xml的四种方法(转)
    liunx命令之whereis、which、find的区别和联系
    wancms从apache迁移至nginx
    面试题
    NP
    Careercup | Chapter 7
    OS | 哲学家问题
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/8505050.html
Copyright © 2011-2022 走看看