zoukankan      html  css  js  c++  java
  • 关于Django中间件自己的一点理解

    Django中间件我觉得是一个非常重要的东西,所以把自己的一些理解分享出来,哪里有不对的还希望大家可以帮助我修改。

    因为是自己写的代码,所以就把代码粘过来了,里边每一部分都会有自己的理解和注释,见谅!

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect,HttpResponse
    
    
    #对于有些Django没有MiddleMixin类,就在上边自己写一个,但是这时上边的类引用就不要再引了
    # class MiddlewareMixin(object):
    #     def __init__(self, get_response=None):
    #         self.get_response = get_response
    #         super(MiddlewareMixin, self).__init__()
    #
    #     def __call__(self, request):
    #         response = None
    #         if hasattr(self, 'process_request'):
    #             response = self.process_request(request)
    #         if not response:
    #             response = self.get_response(request)
    #         if hasattr(self, 'process_response'):
    #             response = self.process_response(request, response)
    #         return response
    
    #有的Django版本不支持上边的MiddleMixin类,这时你需要自己在上边写一个MiddleMixin类
    #定义完自己的中间件加到SETTINGS文件里就可以用了。
    class M1(MiddlewareMixin):
        def process_request(self,request):
            # if request.path_info=='login':
            #     return None
            # elif request.session.get('user'):
            #     return redirect('login')
            print('M1_process_request',request)
    
        def process_response(self,request,response):
            print('M1_request_response')
            return response
    #关于中间件的process_view函数,其实就是帮助路由匹配系统匹配视图函数的中间件,所以在执行完process_request函数以后,会执行
    #这里的process_view来匹配视图函数,匹配到以后再去执行视图函数的函数体(注意这里的匹配到并不是匹配到就结束,而是全部都要匹
    # 配一遍),所以process_view的执行结果会在视图函数之前,之后再去执行exception函数(如果匹配到异常的话,注意这里的异常只捕
    #捉一次),最后再去执行process_response函数
    
    #对于在process_view函数中直接返回结果的情况,这时不再执行接下来的process_view函数,也不再执行视图函数,而是直接从最底端
    # 开始执行倒序的process_response函数,这时可以说process_view函数替代了原来的视图函数。
        def process_view(self, request, callback, callback_args, callback_kwargs):
            print('M1.process_view')
    
        def process_exception(self,request,response):
            print('M1.process_exception')
            return HttpResponse('Internal_Error(M1),This is PROCESS_EXCEPTION_HANDLING_FUNCTION')
    
    class M2(MiddlewareMixin):
        def process_request(self,request):
            print('M2_process_request')
    
        def process_response(self,request,response):
            print('M2_process_response')
            return response
    
        def process_view(self, request, callback, callback_args, callback_kwargs):
            print('M2.process_view')
    
        def process_exception(self,request,response):
            print('M2.process_exception')
            return HttpResponse('Internal_Error(M2),This is PROCESS_EXCEPTION_HANDLING_FUNCTION')
    
    #中间件流程总结:
    #①.在没有process_view或者process_exception时,浏览器的访问请求通过与Django独立的wsgi模块建立socket链接,在这之后通过Django
    #设置的中间件(本身是类,并且可以调用类下定义的方法),顺序是按照配置文件里的中间件中的列表顺序执行中间件的process_request部分,
    #遇到不是return None的process_request就会中断,然后从当前终止的位置倒序执行process_response
    
    #②.如果中间件定义了process_view,这时就会顺序执行process_request,执行结束,再从头开始执行process_view以及request_response
    #的中间件方法.
    
    #具体显示效果如下:
    # M1_process_request <WSGIRequest: GET '/favicon.ico'>
    # M2_process_request
    # Not Found: /favicon.ico
    # [18/Sep/2017 18:32:58] "GET /favicon.ico HTTP/1.1" 404 2061
    # M2_process_response
    # M1_request_response
    # [18/Sep/2017 18:32:59] "GET / HTTP/1.1" 200 62
    # M1_process_request <WSGIRequest: GET '/'>
    # M2_process_request
    # M1.process_view
    # M2.process_view
    # This is Index View_Function
    # M2.process_exception
    # M2_process_response
    # M1_request_response
    
    #③对于process_response,一定要有返回值,不然访问页面时,后端会报错。
    #同时,中间件的process_request处理完请求,视图函数也处理完请求返回值时,倒序通过process_response的return返回值,期间我们
    #可以通过process_response处理视图函数返回的值,从而达到修改视图函数返回结果的效果。
    

      

  • 相关阅读:
    Swift
    Swift
    UVa
    Go如何发送广播包
    人迹罕至的android要完全退出程序的一种方法
    备注ocp_ORACLE专题网络
    JS它DOM
    HDU 1693 Eat the Trees 插头DP
    ubuntu-14.04 系统安装mysql-5.6.21
    1941设置站点模板,一生珍藏,所有玩具
  • 原文地址:https://www.cnblogs.com/575dsj/p/7544860.html
Copyright © 2011-2022 走看看