日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django组件-中间件

發布時間:2024/8/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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组件-中间件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。