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

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

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

知道在哪裏改後,接着就是改這些方法的返回信息了,我但願給前端返回這樣格式的信息:

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

而後用這個 dict 直接替換 Response 裏面的信息就好了,以下:3d

這裏就放一張,其它的相似修改

替換後,嘗試請求下接口,默認的返回格式就變成咱們定義的樣子了,可是,任務還沒完成,在只有一個接口的狀況下,這樣改改沒什麼,可是若是有十幾個,幾十個接口的話,這樣一個個接口去改,不但累人還很差維護,因此這裏換種方法。調試

咱們經過定義一個繼承於 ModelViewSet 的類,而後全部的接口再也不繼承 ModelViewSet 而繼承於這個 CustomViewSet,這就不用一個個接口去改了,還方便維護。rest

到此爲止,任務依然沒有完成,成功的返回咱們是定義好了,可是接口發生異常的時候,返回的信息仍是默認的那些信息,由於咱們改的只是正常處理完成後的成功返回,異常返回咱們是沒有處理,那異常信息的返回應該在哪裏改?code

一頓調試後,我發現了當接口發生異常後,是由exception_handler這個方法去處理的。這個方法定義在rest_framework/views.py裏,由於這個方法是獨立出來的,不是定義在 ModelViewSet 裏面,因此就沒辦法經過重寫的方法來改了,咱們把整個方法複製出來,放在CustomViewSet下面(固然沒有規定要放在一塊兒,放在哪裏都行,方便管理就行)。cdn

能夠看出,第95行到98行就是咱們須要改的地方,調試看一下這個對象是怎樣的,而後進一步把裏面咱們須要的信息提取出來,改爲這個樣子:對象

最重要的一步!要在settings.py裏面的 REST_FRAMEWORK(本身添加的)裏添加多一條這樣的配置:blog

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,代替手動寫返回信息,避免錯誤。
相關文章
相關標籤/搜索