Django组件-中间件
中間件是介于request與response處理之間的一道處理過程,相對比較輕量級,并且在全局上改變django的輸入與輸出.因為改變的是全局,所以需要謹慎使用,用不好會影響到性能.
Django默認的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', ]自定義中間件
中間件一共有四個方法:
process_requestprocess_viewprocess_exceptionprocess_response當用戶發起請求的時候會一次經過所有的中間件,這個時候的請求是process_request,最后到達views的函數中,views函數處理后,再一次穿過中間件,這個時候是process_response,最后返回給請求者.
上述圖中的中間件都是django中的,我們也可以自己定義一個中間件,自己寫一個類,但是必須繼承MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin自定義中間件
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print("Md1請求")def process_response(self,request,response):print("Md1返回")return responseclass Md2(MiddlewareMixin):def process_request(self,request):print("Md2請求")#return HttpResponse("Md2中斷")def process_response(self,request,response):print("Md2返回") return response結果:
Md1請求 Md2請求 view函數 Md2返回 Md1返回如果當請求到達請求2的時候直接不符合條件返回,即return HttpResponse("Md2中斷"),程序將把請求直接發給中間件2返回,然后依次返回到請求者,結果如下:
?
Md1請求 Md2請求 Md2返回 Md1返回流程圖如下:
?
如果修改為:
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print("Md1請求")#return HttpResponse("Md1中斷")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("Md1view")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2請求")return HttpResponse("Md2中斷")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("Md2view")結果如下:
Md1請求 Md2請求 Md1view Md2view view函數 Md2返回 Md1返回?
?
當最后一個中間的process_request到達路由關系映射之后,返回到中間件1的process_view,然后依次往下,到達view函數,最后通過process_response依次返回到達用戶.
process_view可以用來調用視圖函數
process_exception
process_exception(self, request, exception)示例修改如下:
class Md1(MiddlewareMixin):def process_request(self,request):print("Md1請求")#return HttpResponse("Md1中斷")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):# return HttpResponse("hello")# response=callback(request,*callback_args,**callback_kwargs)# return responseprint("md1 process_view...")def process_exception(self):print("md1 process_exception...")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2請求")# return HttpResponse("Md2中斷")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("md2 process_view...")def process_exception(self):print("md1 process_exception...")結果如下:
Md1請求 Md2請求 md1 process_view... md2 process_view... view函數...Md2返回 Md1返回?
當views出現錯誤時:
將Md2的process_exception修改如下:
def process_exception(self, request, exception):print("md2 process_exception...")return HttpResponse("error")結果如下:
Md1請求 Md2請求 md1 process_view... md2 process_view... view函數... md2 process_exception... Md2返回 Md1返回?
轉載于:https://www.cnblogs.com/s593941/p/10012048.html
總結
以上是生活随笔為你收集整理的Django组件-中间件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《linux就该这么学》第七节课:文件的
- 下一篇: Python爬虫入门之四urllib-G