中间介(MiddleWare)
?引子-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 response7、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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到被两条蛇咬了是什么征兆
- 下一篇: win10网速慢