在Django中介軟體處對API進行統一處理

2021-10-05 03:24:16 字數 4386 閱讀 8517

公司實習時遇到乙個問題:專案中所使用不是restful api,每個檢視函式都要先生成字典,於是專案中便充斥著如下的**:

維護起來比較麻煩,對前端也很不友好,為了解決該問題,自定義了乙個django中介軟體對api格式和異常進行統一處理,以此達到如下效果:

中介軟體中可以定義5個方法:

中介軟體在收到request請求之後執行

按照settings.pymiddleware_classes的順序,順序執行

如果該函式返回none,繼續執行後面的中介軟體的process_request方法

如果該函式返回httpresponse,則不再繼續執行後面的中介軟體的process_request方法

執行完所有中介軟體的process_request方法

urls.py中找到對應檢視函式

拿到檢視函式的名稱、引數,在執行檢視函式之前執行

如果返回none,則繼續執行後面的中介軟體的process_view函式,然後執行下昂應的檢視函式

如果返回httpresponse,則不執行後續的process_view函式,也不執行檢視函式,然後執行所有的response中介軟體

執行檢視函式的過程中如果引發異常,則按照settings.pymiddleware_classes的順序,倒序執行process_exception方法

如果返回none,繼續執行下乙個中介軟體的process_exception方法

如果返回httpreponse物件,則該中介軟體上方其他中介軟體的process_exception方法不會被呼叫

一旦其中某個中介軟體有返回值,則呼叫template_responseresponse中介軟體

,否則啟動預設的異常處理

最後半句個人理解:如果如果所有中介軟體的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』))

檢視函式中對引數不做校驗,只需在中介軟體新增一句,即可對檢視函式中raisekeyerror進行統一處理

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處理檢視的不同階段對輸入或輸出進行...