轉自 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 的,這樣這些修改就不能繼承到了,在這樣的情況下,每寫一次接口,都要自己手動敲一遍這些信息,難免會手快敲錯了,在這里我定義了一個類:

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

總結:
- 自定義一個繼承於
ModelViewSet
的類,重寫create、list、update、retrieve、destroy這些方法,修改Response - 復制
rest_framework/views.py/exception_handler
方法,修改里面處理異常信息的代碼 - 在
settings.py
的REST_FRAMEWORK
配置里面添加'EXCEPTION_HANDLER': 'common.views.exception_handler'
- (可選)新建一個返回信息類
ResturnMsg
,代替手動寫返回信息,避免錯誤。
作者:Conamore
鏈接:https://juejin.cn/post/6844903876982734855
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。