• Django--中间件


    中间件

    Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

    我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

    1 中间件的定义方法

    定义一个中间件工厂函数,然后返回一个可以别调用的中间件。

    中间件工厂函数需要接收一个可以调用的get_response对象。

    返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

    第一种自定义方法:

     1 #定义中间件
     2 def my_middleware(get_response):
     3     print('init 被调用')
     4     def middleware(request):
     5         print('before request 被调用')
     6         response = get_response(request)
     7         print('after response 被调用')
     8         return response
     9     return middleware
    10 
    11 #定义视图
    12 def demo_view(request):
    13     print('view 视图被调用')
    14     return HttpResponse('OK')
    15 
    16 
    17 #init 被调用
    18 #before request 被调用
    19 #view 视图被调用
    20 #after response 被调用
    21 
    22 views.py

    第二种自定义方法:

    • process_request(self,request) 发送请求
    • process_view(self, request, callback, callback_args, callback_kwargs) 执行完 request 预处理函数并确定待执行的 view 之后,但在 view 函数实际执行之前。
    • process_template_response(self,request,response) response参数应该是一个由view或者中间件返回的TemplateResponse对像(或等价的对象)。如果响应的实例有render()方法,process_template_response()会在view刚好执行完毕之后被调用。这个方法必须返回一个实现了render方法的响应对象。
    • process_exception(self, request, exception) 收集错误信息,当一个view引发异常时,Django会调用process_exception()来处理。返回一个None或一个HttpResponse对象。如果返回HttpResponse对象,会将响应交给处理响应的中间件处理。由于处理响应时是从下到上的,此层以上的process_exception()是不会被调用的。
    • process_response(self, request, response) 必须返回 HttpResponse 对象。这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
     1 from django.utils.deprecation import MiddlewareMixin
     2 class UserYanzheng(MiddlewareMixin):
     3 #视图处理前触发
     4     def process_request(self,request):
     5         print("用户中间件验证------>1111111")
     6 #视图处理以后返回response时出发
     7     def process_response(self,request,response):
     8         print("用户验证中间件的response部分---------->")
     9         return response
    10 
    11 
    12 
    13 #用户中间件验证------>1111111
    14 #函数执行
    15 #用户验证中间件的response部分---------->

    2 执行流程

    3 多个中间件的执行顺序

    • 在请求视图被处理前,中间件由上至下依次执行
    • 在请求视图被处理后,中间件由下至上依次执行

     1 def my_middleware(get_response):
     2     print('init 被调用')
     3     def middleware(request):
     4         print('before request 被调用')
     5         response = get_response(request)
     6         print('after response 被调用')
     7         return response
     8     return middleware
     9 
    10 def my_middleware2(get_response):
    11     print('init2 被调用')
    12     def middleware(request):
    13         print('before request 2 被调用')
    14         response = get_response(request)
    15         print('after response 2 被调用')
    16         return response
    17     return middleware
    18 
    19 def zhong1(get_response):
    20     print("我是测试1111")
    21     def jian(request):
    22         if request.path == "/app01/login/":
    23             print('我是测试222222')
    24             response = get_response(request)
    25             print("我是测试3333")
    26         else:
    27             print('我是测试二二二二二二')
    28             response = get_response(request)
    29             print("我是测试3333")
    30 
    31         return response
    32     return jian
    33 
    34 
    35 from django.utils.deprecation import MiddlewareMixin
    36 class UserYanzheng(MiddlewareMixin):
    37     def process_request(self,request):
    38         print("用户中间件验证------>1111111")
    39 
    40     def process_response(self,request,response):
    41         print("用户验证中间件的response部分---------->")
    42         return response
     1 MIDDLEWARE = [
     2     'django.middleware.security.SecurityMiddleware',
     3     'django.contrib.sessions.middleware.SessionMiddleware',
     4     'django.middleware.common.CommonMiddleware',
     5     # 'django.middleware.csrf.CsrfViewMiddleware',
     6     'django.contrib.auth.middleware.AuthenticationMiddleware',
     7     'django.contrib.messages.middleware.MessageMiddleware',
     8     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     9     'corsheaders.middleware.CorsMiddleware',
    10     'ppapp01.views.my_middleware2',
    11     'ppapp01.views.my_middleware',
    12     'ppapp01.views.zhong1',
    13     'ppapp01.views.UserYanzheng',
    14 ]
    setting.py
    我是测试1111
    init 被调用
    init2 被调用
    before request 2 被调用
    before request 被调用
    我是测试二二二二二二
    用户中间件验证------>1111111
    函数执行
    用户验证中间件的response部分---------->
    我是测试3333
    after response 被调用
    after response 2 被调用
  • 相关阅读:
    LVS,NET,TUNL,DR实现负载均衡
    Redis的基本数据结构,基本操作
    mongoDB基本操作
    mysql高级操作(优化)
    sphix使用及即时索引配置
    java client 通过zookeeper连接hbase问题
    TCP/UDP load balance
    Hacking your way to enlightenment with Kafka and Node.js
    flume问题
    linux点滴
  • 原文地址:https://www.cnblogs.com/qq128/p/12124218.html
Copyright © 2020-2023  润新知