統一 修改 Django Rest framework ModelViewSet 的默認返回信息


轉自 https://juejin.cn/post/6844903876982734855

drf API 接口默認返回的只是數據的JSON字符串,不包含其它的接口信息,甚至有時候格式也不一致,這對前端不太友好,所以我希望把這個返回修改一下,往返回信息里面添加一些額外的信息,如狀態說明等信息

首先,要知道在哪里修改這個返回,翻一下源碼發現這些返回信息是寫在create()list()retrieve()update()destroy()這些方法里的,這些信息都放在Response對象里面返回到前端頁面去。

 

 

 

 

 

 

 

 

 

知道在哪里改后,接着就是改這些方法的返回信息了,我希望給前端返回這樣格式的信息:

 

{'code': 1, 'msg': '成功', 'errors': {}, 'data': []} # errors 放具體的錯誤信息,data 放返回去的數據

然后用這個 dict 直接替換 Response 里面的信息就行了,如下:

 

這里就放一張,其它的類似修改

 

替換后,嘗試請求下接口,默認的返回格式就變成我們定義的樣子了,但是,任務還沒完成,在只有一個接口的情況下,這樣改改沒什么,但是如果有十幾個,幾十個接口的話,這樣一個個接口去改,不但累人還不好維護,所以這里換種方法。

我們通過定義一個繼承於 ModelViewSet 的類,然后所有的接口不再繼承 ModelViewSet 而繼承於這個 CustomViewSet,這就不用一個個接口去改了,還方便維護。

 

 

到此為止,任務依然沒有完成,成功的返回我們是定義好了,但是接口發生異常的時候,返回的信息還是默認的那些信息,因為我們改的只是正常處理完成后的成功返回,異常返回我們是沒有處理,那異常信息的返回應該在哪里改?

一頓調試后,我發現了當接口發生異常后,是由exception_handler這個方法去處理的。這個方法定義在rest_framework/views.py里,因為這個方法是獨立出來的,不是定義在 ModelViewSet 里面,所以就沒辦法通過重寫的方法來改了,我們把整個方法復制出來,放在CustomViewSet下面(當然沒有規定要放在一起,放在哪里都行,方便管理就行)。

 

 

可以看出,第95行到98行就是我們需要改的地方,調試看一下這個對象是怎樣的,然后進一步把里面我們需要的信息提取出來,改成這個樣子:

 

 

最重要的一步!要在settings.py里面的 REST_FRAMEWORK(自己添加的)里添加多一條這樣的配置:

REST_FRAMEWORK = {
    ······
    ······
    
    'EXCEPTION_HANDLER': 'common.views.exception_handler' } 復制代碼

這里指定了使用哪個方法作為接口異常的處理器,這個設置成我們剛剛改那個。

PS: 雖然做了上面的修改后,就修改了系統上大部分的返回信息,但是有時候我們需要定一個接口不是繼承 ModelViewSet 的,這樣這些修改就不能繼承到了,在這樣的情況下,每寫一次接口,都要自己手動敲一遍這些信息,難免會手快敲錯了,在這里我定義了一個類:

 

 

那上面的接口就可以改成這個樣子了,更加的方便維護:

 

 

總結:

  1. 自定義一個繼承於ModelViewSet的類,重寫createlistupdateretrievedestroy這些方法,修改Response
  2. 復制rest_framework/views.py/exception_handler方法,修改里面處理異常信息的代碼
  3. settings.pyREST_FRAMEWORK配置里面添加'EXCEPTION_HANDLER': 'common.views.exception_handler'
  4. (可選)新建一個返回信息類ResturnMsg,代替手動寫返回信息,避免錯誤。

作者:Conamore
鏈接:https://juejin.cn/post/6844903876982734855
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM