1. 程式人生 > >關於Django中間件自己的一點理解

關於Django中間件自己的一點理解

顯示 exce error bsp func sel callback except ddl

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

關於Django中間件自己的一點理解