zoukankan      html  css  js  c++  java
  • Django学习-18-中间件

    为了验证中间件功能和函数执行过程,手动注册3个中间件到setting.py文件中

    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',
        'Middle.m1.Middle1',
        'Middle.m1.Middle2',
        'Middle.m1.Middle3',
    ]

    3个中间件代码

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class Middle1(MiddlewareMixin):
        def process_request(self,request):
            print('第一个中间件的请求函数')
    
        def process_view(self,request, callback_func, callback_func_args, callback_func_kwargs):
            # url(r'^user_listd+', views.user_list)
            # callback_func_args   --> 存没有变量名的参数
            # url(r'^user_list(?P<nid>d+)', views.user_list)
            # callback_func_kwargs --> 存有变量名的参数
            print('第一个中间件的视图函数') 
            
        def process_exception(self, request, exception): 
            #如果views.py函数执行出错,自动执行 
            if isinstance(exception, ValueError): 
                print('第一个中间件的异常处理函数')
                
        def process_response(self,request,response): 
            print('第一个中间件的回复函数') 
            return response 
            
        def process_template_response(self, request, response): 
            #默认不执行 
            #如果views返回的对象中具有render方法,该方法自动执行 print('第一个中间件的模板函数') 
            return response 
            
    class Middle2(MiddlewareMixin): 
        def process_request(self,request): 
            print('第二个中间件的请求函数') 
                
        def process_view(self,request, callback_func, callback_func_args, callback_func_kwargs): 
            print('第二个中间件的视图函数') 
                
        def process_exception(self, request, exception): 
            if isinstance(exception, ValueError): 
                print('第二个中间件的异常处理函数') 
                # return HttpResponse("发生ValueError错误。。。") 
                    
        def process_response(self,request,response): 
            print('第二个中间件的回复函数') 
            return response
            
        def process_template_response(self, request, response):
            print('第二个中间件的模板函数')
            return response
    
    class Middle3(MiddlewareMixin):
        def process_request(self,request):
            print('第三个中间件的请求函数')
    
        def process_view(self,request, callback_func, callback_func_args, callback_func_kwargs):
            print('第三个中间件的视图函数')
    
        def process_response(self,request,response):
            print('第三个中间件的回复函数')
            return response
    
        def process_exception(self, request, exception):
            if isinstance(exception,ValueError):
                print('第三个中间件的异常处理函数')
                #return HttpResponse("发生ValueError错误。。。")
    
        def process_template_response(self, request, response):
            print('第三个中间件的模板函数')
            return response
    #render方法的执行
    class Foo():
        def render(self):
            return HttpResponse("<h1>readding a book!!</h1>")
    def read(request):return Foo()

    加入中间件后的请求周期

    完整的请求周期:
      request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) ->   view1 -> view2 -> view3 -> views中的函数 -> response3 -> response2 -> response1 request函数return: Django1.8、1.9之前:request1 -> request2(return) ->response3 -> response2 -> response1 Django1.10之后:request1 -> request2(return) -> response2 -> response1 views.py中的函数执行报错(exceptionX不return): request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) -> view1 -> view2 -> view3 -> views中的函数异常 -> exception3 -> exception2 -> exception1 -> response3 -> response2 -> response1 views.py中的函数执行报错(exception2--->return): request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) -> view1 -> view2 -> view3 -> views中的函数异常 -> exception3 -> exception2 -> response3 -> response2 -> response1 加上template函数之后的请求周期: #template只有在views.py中执行了render方法后才会被调用,并且他自己也必须要返回response request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) -> view1 -> view2 -> view3 -> views中的函数 -> template3 -> template2 -> template1 -> response3 -> response2 -> response1
     
  • 相关阅读:
    一个简单的批量更新oracle 数据库中 最近的服务商名称的数据
    sql 分组后显示每组的前几条记录
    基于server broker 的数据实时更新
    Oracle中的三种Join 方式
    weblogic内存调整说明
    TongWeb
    国产数据库助力民航核心交易系统
    weblogic的集群与配置
    项目管理软考
    浮躁的过去,开启的项目管理之路(四)
  • 原文地址:https://www.cnblogs.com/cq146637/p/7816504.html
Copyright © 2011-2022 走看看