公司實習時遇到乙個問題:專案中所使用不是restful api,每個檢視函式都要先生成字典,於是專案中便充斥著如下的**:
維護起來比較麻煩,對前端也很不友好,為了解決該問題,自定義了乙個django中介軟體對api格式和異常進行統一處理,以此達到如下效果:
中介軟體中可以定義5個方法:
中介軟體在收到request
請求之後執行
按照settings.py
中middleware_classes
的順序,順序執行
如果該函式返回none
,繼續執行後面的中介軟體的process_request
方法
如果該函式返回httpresponse
,則不再繼續執行後面的中介軟體的process_request
方法
執行完所有中介軟體的process_request
方法
在urls.py
中找到對應檢視函式
拿到檢視函式的名稱、引數,在執行檢視函式之前執行
如果返回none
,則繼續執行後面的中介軟體的process_view
函式,然後執行下昂應的檢視函式
如果返回httpresponse
,則不執行後續的process_view
函式,也不執行檢視函式,然後執行所有的response
中介軟體
執行檢視函式的過程中如果引發異常,則按照settings.py
中middleware_classes
的順序,倒序執行process_exception
方法
如果返回none
,繼續執行下乙個中介軟體的process_exception
方法
如果返回httpreponse
物件,則該中介軟體上方其他中介軟體的process_exception
方法不會被呼叫
一旦其中某個中介軟體有返回值,則呼叫template_response
和response
中介軟體
,否則啟動預設的異常處理
最後半句個人理解:如果如果所有中介軟體的process_exception
方法都執完後還沒有返回值,則啟動預設的異常處理
在檢視函式執行結束之後執行
response
是django檢視或者某一中介軟體的返回值(templateresponse
物件或等價)
只有response
實現了render
方法才會執行
一旦所有的中介軟體的template_response
被執行完,則呼叫render
方法
按照中介軟體的順序,倒序執行
在檢視函式執行結束之後執行
必須有返回值,且返回型別必須是httpresponse
物件
按照中介軟體的順序,倒序執行
修改setting
中的middleware_classes
變數
code
123
4567
8910
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』,
『middleware.mymiddleware』,
]
目前想出來了兩種策略(假設post_json
為序列化後的字典):
檢視函式中使用get
從字典中獲取引數,判斷required
的引數是否為空,raise
自定義的異常,如:
code
123
4567
891011
1213
1415
1617
1819
2021
2223
# exception.py
…class validationerror(baseexception):
msg = errormsg.invalid_argument
status = 1001
…# message.py
class errormsg:
unknown_exception= _(『unknown exception.』)
invalid_argument = _(『invalid arguments.』)
required_argument = _(『a argument is required.』)
# view.py
def test(request):
…user_name = post_json.get(『username』,『』)# required
pass_word = post_json.get(『password』,『』)# required
user_type = post_json.get(『user_type』,『』)# not required
if not username or not password:
raise validationerror(errormsg.required_argument.format(『username/passswordd』))
…
檢視函式中對引數不做校驗,只需在中介軟體新增一句,即可對檢視函式中raise
的keyerror
進行統一處理
code
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
2627
# exception.py
…class validationerror(baseexception):
msg = errormsg.invalid_argument
status = 1001
…# middleware.py
…def process_exception(self, request, exception):
if isinstance(exception, keyerror):
exception = validationerror(errormsg.required_argument.format(exception))
…# message.py
class errormsg:
unknown_exception= _(『unknown exception.』)
invalid_argument = _(『invalid arguments.』)
required_argument = _(『a argument is required.』)
# view.py
def test(request):
…user_name = post_json[『user_name』] # required
user_type = post_json.get(『user_type』,『』)# not required
…
目前檢視函式必須有返回值,不能為none
,還不知道怎麼解決 Django 中介軟體
django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的執行過程如下圖所示 django在中介軟體中預置了五個方法,這五個方法的區別在於不同的階段執行,對輸入或輸出進行干預,方法如下 def init self pa...
Django中介軟體
給檢視函式加裝飾器判斷使用者是否登入,把沒有登入的請求跳轉到登入頁面,我們通過給幾個特定檢視函式加裝飾器實現了這個需求,但是這樣做比較繁瑣,用django中的中介軟體會比較簡潔 什麼是中介軟體 中介軟體是幫助我們再檢視函式執行之前和執行之後都可以做一些額外的操作,它本質上就是乙個自定義類,類中定義了...
Django中介軟體
什麼是中介軟體?django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的設計為開發者提供了一種無侵入式的開發方式,增強了django框架的健壯性。我們可以使用中介軟體,在django處理檢視的不同階段對輸入或輸出進行...