?引子-Django的生命周期
在學習中間介之前,我們先來回顧一下Django的生命周期:用戶發起請求,請求會被發送到urlconf中的url,然后會指向對應的views函數進行處理,views函數處理完成后,用模板渲染好html,然后返回給用戶的瀏覽器。
加上中間介的流程如下:
在Django中的setttings文件有配置middleware
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',
]
執行順序從上到下。
自定義中間介
1、自定義中間介
新建一個名為middle的包,下面新建文件md.py,
內容如下:
from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self,request):print "MD1 process_request"def process_response(self,request,response):print "MD1 process_response"return responseclass MD2(MiddlewareMixin):def process_request(self,request):print "MD2 process_request"def process_response(self,request,response):print "MD2 process_response"print responsereturn response
2、setttings文件配置
MIDDLEWARE新增中間介配置:
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.md1.MD1','middle.md1.MD2',
]
3、視圖函數
views.py
def md(request):print "views function"return HttpResponse('execute view function')
4、urls.py文件
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/', views.index),url(r'^mf/', views.mf),url(r'^fm/', views.fm),url(r'^myform/', views.myform),url(r'md',views.md),]
5、訪問URL
瀏覽器返回視圖函數的內容:
后臺執行:
中間介依次執行,
MD1的process_request,MD2的process_request
MD2的process_response,MD1的process_response
中間介的response值為視圖函數的返回值。
?
?
?
class MD1(MiddlewareMixin):def process_request(self,request):print "MD1 process_request"
#process_request函數有返回值時,會直接返回給用戶,而不往下執行。return HttpResponse('MD1 process_request')def process_response(self,request,response):print "MD1 process_response"return response
執行結果為:
?
多個middleware的整體執行流程如下:
?
?
MiddlewareMixin函數
源碼
class MiddlewareMixin(object):#構造函數執行父類的構造函數def __init__(self, get_response=None):self.get_response = get_responsesuper(MiddlewareMixin, self).__init__()def __call__(self, request):response = None#如果當前中間介有process_request方法,則執行if hasattr(self, 'process_request'):response = self.process_request(request)#如果當前中間介沒有process_request方法,則執行下一個中間介的__call__(),依次循環執行下去if not response:response = self.get_response(request)#執行當前中間介的process_reponse方法if hasattr(self, 'process_response'):response = self.process_response(request, response)return response
7、8、9版本里面process_request和process_response方法都是必須寫的,10版本以后可以不寫,但是為了過渡,最好寫上。
?每個中間介,可能只有process_request,也可能只有process_response方法。
?
總結
中間介整體執行流程
?
中間介應用場景
對于所有的用戶統一的請求都需要處理,這時就需要中間介可以搞定,如果是部分用戶請求,可以用裝飾器進行處理。
csrf是通過判斷request的header里面是否有csrf參數。
?
最常用的方法
process_request
因為process_request方法可以在用戶請求時,做統一的操作非常方便、靈活,比如設置白名單。
?