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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中间介(MiddleWare)

發(fā)布時(shí)間:2023/11/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中间介(MiddleWare) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?引子-Django的生命周期

在學(xué)習(xí)中間介之前,我們先來回顧一下Django的生命周期:用戶發(fā)起請求,請求會(huì)被發(fā)送到urlconf中的url,然后會(huì)指向?qū)?yīng)的views函數(shù)進(jìn)行處理,views函數(shù)處理完成后,用模板渲染好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', ]

執(zhí)行順序從上到下。

自定義中間介

1、自定義中間介

新建一個(gè)名為middle的包,下面新建文件md.py,

內(nèi)容如下:

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、視圖函數(shù)

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

瀏覽器返回視圖函數(shù)的內(nèi)容:

后臺(tái)執(zhí)行:

中間介依次執(zhí)行,

MD1的process_request,MD2的process_request
MD2的process_response,MD1的process_response

中間介的response值為視圖函數(shù)的返回值。

?

 

?

?

class MD1(MiddlewareMixin):def process_request(self,request):print "MD1 process_request"
#process_request函數(shù)有返回值時(shí),會(huì)直接返回給用戶,而不往下執(zhí)行。return HttpResponse('MD1 process_request')def process_response(self,request,response):print "MD1 process_response"return response

  

執(zhí)行結(jié)果為:

?

多個(gè)middleware的整體執(zhí)行流程如下:

?

?

MiddlewareMixin函數(shù)

源碼

class MiddlewareMixin(object):#構(gòu)造函數(shù)執(zhí)行父類的構(gòu)造函數(shù)def __init__(self, get_response=None):self.get_response = get_responsesuper(MiddlewareMixin, self).__init__()def __call__(self, request):response = None#如果當(dāng)前中間介有process_request方法,則執(zhí)行if hasattr(self, 'process_request'):response = self.process_request(request)#如果當(dāng)前中間介沒有process_request方法,則執(zhí)行下一個(gè)中間介的__call__(),依次循環(huán)執(zhí)行下去if not response:response = self.get_response(request)#執(zhí)行當(dāng)前中間介的process_reponse方法if hasattr(self, 'process_response'):response = self.process_response(request, response)return response

  7、8、9版本里面process_request和process_response方法都是必須寫的,10版本以后可以不寫,但是為了過渡,最好寫上。

?每個(gè)中間介,可能只有process_request,也可能只有process_response方法。

?

總結(jié)

中間介整體執(zhí)行流程

?

中間介應(yīng)用場景

對于所有的用戶統(tǒng)一的請求都需要處理,這時(shí)就需要中間介可以搞定,如果是部分用戶請求,可以用裝飾器進(jìn)行處理。

csrf是通過判斷request的header里面是否有csrf參數(shù)。

?

最常用的方法

process_request

因?yàn)閜rocess_request方法可以在用戶請求時(shí),做統(tǒng)一的操作非常方便、靈活,比如設(shè)置白名單。

?

轉(zhuǎn)載于:https://www.cnblogs.com/skyflask/p/9823498.html

總結(jié)

以上是生活随笔為你收集整理的中间介(MiddleWare)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。