關於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處理視圖函數返回的值,從而達到修改視圖函數返回結果的效果。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM