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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

什么是中间件?中间件的作用,怎么使用中间件及应用场景

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是中间件?中间件的作用,怎么使用中间件及应用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是中間件?中間件的作用,怎么使用中間件及應用場景

如果你想修改請求,例如被傳送到view中的HttpRequest對象。 或者你想修改view返回的HttpResponse對象,這些都可以通過中間件來實現。

可能你還想在view執行之前做一些操作,這種情況就可以用 middleware來實現。

Django默認的中間件:(在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件,如下圖)

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',# 'app01.mymid.MyMid1',# 'app01.mymid.MyMid2', ]

請求進來是自上而下,通過反射找到類,用for循環來執行,可以自定義中間件,但是也要寫在MIDDLEWARE中,可以在app01下創建一個mymid.py文件來寫我們自定義的中間件

每一個中間件都有具體的功能

三、自定義中間件

中間件可以定義五個方法,分別是:(主要的是process_request和process_response)

1、process_request(self,request)2、process_view(self, request, callback, callback_args, callback_kwargs)3、process_template_response(self,request,response)4、process_exception(self, request, exception)5、process_response(self, request, response)

以上方法的返回值可以是None或一個HttpResponse對象,如果是None,則繼續按照django定義的規則向后繼續執行,如果是HttpResponse對象,則直接將該對象返回給用戶。

詳細用法見下方:

1、process_request和process_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

第三步:在view中定義一個視圖函數(index)

def index(request):print("view函數...")return HttpResponse("OK")

第四步:在settings.py的MIDDLEWARE里注冊自己定義的中間件

運行結果:

Md1請求# Md2請求# view函數...# Md2返回# Md1返回#

**注意:**如果當請求到達請求2的時候直接不符合條件返回,即return HttpResponse(“Md2中斷”),程序將把請求直接發給中間件2返回,然后依次返回到請求者,結果如下:

返回Md2中斷的頁面,后臺打印如下:

Md1請求# Md2請求# Md2返回# Md1返回#

流程圖如下:

由此總結一下:

  • 中間件的process_request方法是在執行視圖函數之前執行的。
  • 當配置多個中間件時,會按照MIDDLEWARE中的注冊順序,也就是列表的索引值,從前到后依次執行的。
  • 不同中間件之間傳遞的request都是同一個對象
  • 多個中間件中的process_response方法是按照MIDDLEWARE中的注冊順序倒序執行的,也就是說第一個中間件的process_request方法首先執行,而它的process_response方法最后執行,最后一個中間件的process_request方法最后一個執行,它的process_response方法是最先執行。

    2、process_view

    process_view(self, request, view_func, view_args, view_kwargs)

    該方法有四個參數

    request是HttpRequest對象。

    view_func是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱作為字符串。)

    view_args是將傳遞給視圖的位置參數的列表(無名分組分過來的值).

    view_kwargs是將傳遞給視圖的關鍵字參數的字典(有名分組分過來的值)。 view_args和view_kwargs都不包含第一個視圖參數(request)。

    Django會在調用視圖函數之前調用process_view方法。

    它應該返回None或一個HttpResponse對象。 如果返回None,Django將繼續處理這個請求,執行任何其他中間件的process_view方法,然后在執行相應的視圖。 如果它返回一個HttpResponse對象,Django不會調用適當的視圖函數。 它將執行中間件的process_response方法并將應用到該HttpResponse并返回結果。

    process_view(self, request, callback, callback_args, callback_kwargs) 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,然后依次往下,到達views函數,最后通過process_response依次返回到達用戶。

    process_view可以用來調用視圖函數:

    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 response

    運行結果:

    Md1請求# Md2請求# view函數...# Md2返回# Md1返回#

    注意:process_view如果有返回值,會越過其他的process_view以及視圖函數,但是所有的process_response都還會執行。

    3、process_exception

    process_exception(self, request, exception)

    該方法兩個參數:

    一個HttpRequest對象

    一個exception是視圖函數異常產生的Exception對象。

    這個方法只有在視圖函數中出現異常了才執行,它返回的值可以是一個None也可以是一個HttpResponse對象。如果是HttpResponse對象,Django將調用模板和中間件中的process_response方法,并返回給瀏覽器,否則將默認處理異常。如果返回一個None,則交給下一個中間件的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,request,exception):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,request,exception):#只有報錯了才會執行exceptionprint("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返回#

    4、process_template_response(self,request,response)

    該方法對視圖函數返回值有要求,必須是一個含有render方法類的對象,才會執行此方法

    class Test:def __init__(self,status,msg):self.status=status#self.msg=msg#def render(self):#import json#dic={'status':self.status,'msg':self.msg}#return HttpResponse(json.dumps(dic)) def index(response):#return Test(True,'測試')

    四 中間件應用場景

    1、做IP訪問頻率限制

    某些IP訪問服務器的頻率過高,進行攔截,比如限制每分鐘不能超過20次。

    2、URL訪問過濾

    如果用戶訪問的是login視圖(放過)

    如果訪問其他視圖,需要檢測是不是有session認證,已經有了放行,沒有返回login,這樣就省得在多個視圖函數上寫裝飾器了!

    作為延伸擴展內容,有余力的同學可以嘗試著讀一下以下兩個自帶的中間件:

    'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',

    總結

    以上是生活随笔為你收集整理的什么是中间件?中间件的作用,怎么使用中间件及应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 丰满少妇被猛烈进入高清播放 | 91视频网页 | 日本手机看片 | 欧美在线不卡 | 九九热中文字幕 | 樱花影院电视剧免费 | 全程粗话对白视频videos | 日韩精品一区二区三区四区五区 | 少妇网站在线观看 | 日韩理论在线观看 | 91看黄 | 青青草小视频 | 国产精品高潮呻吟av | 亚洲精品小视频 | 人人妻人人澡人人爽精品日本 | 秋霞影院午夜丰满少妇在线视频 | 五月天在线播放 | 人妻一区二区三区在线 | 精品国产乱码久久久久久蜜臀 | 探花视频在线免费观看 | 亚洲精品91在线 | 羞羞涩涩网站 | 超碰免费在线播放 | va婷婷 | 午夜激情成人 | 亚洲v国产v欧美v久久久久久 | 波多野结衣绝顶大高潮 | av久久久久久 | 亚洲第一网址 | 特级特黄刘亦菲aaa级 | 综合激情婷婷 | 五月婷婷综合激情网 | 丰满少妇高潮久久三区 | 国语对白做受欧美 | 久久福利片 | 欧美少妇一区二区三区 | 亚洲av成人无码一区二区三区在线观看 | 激情内射亚洲一区二区三区爱妻 | 色桃av| 日韩六九视频 | 香蕉视频首页 | 午夜黄色影院 | 极品美女一区二区三区 | av色资源 | 男女猛烈无遮挡免费视频 | 欧美性猛交xxxxx水多 | 一级黄色大毛片 | 香蕉毛片 | 熟女少妇内射日韩亚洲 | 国产免费高清视频 | 国产真实乱人偷精品视频 | 懂色av一区二区 | 成人免费黄色大片 | 黑人一区二区三区 | 日本五十肥熟交尾 | 亚洲图片中文字幕 | 在线免费观看a视频 | 欧美性猛交xxxx黑人猛交 | 东北女人av | 国产精品成熟老女人 | 欧美午夜性春猛交 | 在线观看亚洲网站 | 日韩成人免费在线观看 | 国产高清一区二区三区 | 男人看的网站 | 黑人大群体交免费视频 | 免费的a级片 | 色站在线| www.欧美在线| 岛国av一区 | 国产在线色 | 国产精品1234 | 国产中文字幕乱人伦在线观看 | 狠狠干夜夜爽 | www.日本在线观看 | 精品国产一区二区三区四 | 精品免费囯产一区二区三区 | 99涩涩| av免费网页| 粉嫩av一区二区三区免费观看 | 亚洲av片不卡无码久久 | 国产av一区二区三区精品 | 日日噜噜噜夜夜爽爽狠狠 | 看全黄大色黄大片美女人 | 91免费观看视频在线 | 中文字幕一级二级三级 | 成人做爰69片免费 | 久久狠 | 精品一区二区三区免费看 | 粗暴video蹂躏hd | 91超碰国产在线 | 小罗莉极品一线天在线 | 日本福利一区二区三区 | 日韩一区二区久久 | 成人免费毛片片v | 国产福利视频在线观看 | 中文字幕在线看片 | 在线精品一区 | 欧美一级生活片 |