django處理一個Request的過程是首先通過django 中間件,然后再通過默認的URL方式進 行的。所以說我們要做的就是在django 中間件這個地方把所有Request攔截住,用我們自己的方式完成處理以后直接返回Response,那么我們可以簡化原來的設(shè)計思路,把中間件不能處理的 Request統(tǒng)統(tǒng)不管,丟給Django去處理。
如果你要在用戶登錄或者其它的處理過程中完成自己的一些處理,那django 中間件非常的合適,感覺和django form一樣,提倡這種dry的哲學(xué)風(fēng)格設(shè)計非常的有意思,下面具體跟著
老王學(xué)習(xí)下把:
先說下django 中間件的安裝方法:
為了激活中間件組件,把它添加到你的settings模塊的MIDDLEWARE_CLASSES列表中,在MIDDLEWARE_CLASSES里,每個中間件
組件通過一個字符串來表示:完整的到中間件的類名的Python路徑,例如,這里是通過django-admin.py startproject創(chuàng)建的
默認的MIDDLEWARE_CLASSES:
- MIDDLEWARE_CLASSES = (
- 'django.middleware.common.CommonMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.middleware.doc.XViewMiddleware',
- )
Django安裝部需要任何中間件--例如MIDDLEWARE_CLASSES可以為空,如果你想這樣的話--但是強烈建議你使用CommonMiddle
ware
順序是有意義的,在請求和視圖階段,Django使用MIDDLEWARE_CLASSES給定的順序申請中間件,而在應(yīng)答和異常階段,Djang
o使用相反的順序申請中間件,即Django把MIDDLEWARE_CLASSES當(dāng)作一種視圖方法的"包裝器":在請求時,它自頂向下申請這
個列表的中間件到視圖,而在應(yīng)答時它反序進行.
再說下django 中間件的定義方法:
請求預(yù)處理:process_request(self, request)
該方法在請求被接收和URL被解析來決定運行哪個視圖之前立即調(diào)用,它傳遞你可能想修改的HttpRequest對象
process_request()應(yīng)該返回None或者HttpResponse對象,如果它返回None,Django將繼續(xù)處理該請求,執(zhí)行任何其它的中間
件然后是合適的視圖
如果請求中間件返回HttpResponse對象,Django將不會再調(diào)用其它任何中間件(任何類型)或者合適的視圖,它將返回該應(yīng)答
視圖預(yù)處理:process_view(self, request, view, args, kwargs)
該方法在請求中間件運行后和URL被解析到一個視圖后和視圖實際上被調(diào)用之前被調(diào)用
傳遞給該視圖的參數(shù)為:
Argument Explanation
request HttpRequest對象
view Django將會調(diào)用來樹立該請求的Python方法,它是實際上的方法對象本身,而不是方法名字符串
args 將被傳遞給視圖的位置參數(shù)列表,不包括request參數(shù)(它一直是視圖的第一個參數(shù))
kwargs 將被傳遞給視圖的關(guān)鍵字參數(shù)字典
像process_request()一樣,process_view()應(yīng)該返回None或者HttpResponse對象,如果它返回None,Django將繼續(xù)處理請求
執(zhí)行任何其它的視圖中間件然后是合適的視圖
如果視圖中間件返回HttpResponse對象,Django將不會再調(diào)用其它任何中間件或者合適的視圖,它將返回該應(yīng)答
應(yīng)答后處理:process_response(self, request, response)
該方法再視圖方法已經(jīng)調(diào)用和應(yīng)答生成后調(diào)用,這是中間件修改應(yīng)答輸出的地方,輸出壓縮(見下)是應(yīng)答中間件的一個顯然
的應(yīng)用
參數(shù)應(yīng)該非常自明了--request是請求對象,response是從視圖返回的應(yīng)答對象
不像請求和視圖中間件,它們可以返回None,process_response()必須返回一個HttpResponse對象,該應(yīng)答可以是傳遞給該
方法的原始應(yīng)答(可能被修改了)或者新的應(yīng)答
異常后處理:process_exception(self, request, exception)
該方法只在出錯并且視圖觸發(fā)不可捕獲的異常時調(diào)用,不包括Http404異常,你可以使用這個鉤子來發(fā)送錯誤通知,在一個日
志文件記錄信息,或者甚至嘗試自動恢復(fù)該錯誤
該方法的參數(shù)是我們一直處理的同樣的request對象和視圖方法觸發(fā)的真正的Exception對象exception
process_exception()可能返回一個作為應(yīng)答顯示給瀏覽器的HttpResponse或者返回None來繼續(xù)Django內(nèi)建的異常處理
比如我們寫了個例子
MIDDLEWARE_CLASSES = (
'apps.auth.middleware.MyAuthenticationMiddleware',
)
然后MyAuthenticationMiddleware定義的方法是:
class LazyMember(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_admin'):
from apps.auth import get_member
request._cached_admin = get_member(request)
return request._cached_admin
class MyAuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session')
request.__class__.admin = LazyMember()
return None
最后總結(jié)一下django 中間件不是很難,用一下就應(yīng)該比較清楚了。老王其實也只是用了一點點django 中間件的知識。如果你對django感興趣的話:可以推薦幾篇相關(guān)的文章: django get_object_or_404,django reverse()