內(nèi)容簡介:drf API 接口默認返回的只是數(shù)據(jù)的JSON字符串礁扮,不包含其它的接口信息瞬沦,甚至有時候格式也不一致,這對前端不太友好僚焦,所以我希望把這個返回修改一下芳悲,往返回信息里面添加一些額外的信息边坤,如首先茧痒,要知道在哪里修改這個返回,翻一下源碼發(fā)現(xiàn)這些返回信息是寫在知道在哪里改后惹苗,接著就是改這些方法的返回信息了耸峭,我希望給前端返回這樣格式的信息:
本文轉(zhuǎn)載自:https://juejin.im/post/5d172420e51d4555fc1accea劳闹,本站轉(zhuǎn)載出于傳遞更多信息之目的洽瞬,版權(quán)歸原作者或者來源機構(gòu)所有伙窃。
drf API 接口默認返回的只是數(shù)據(jù)的?JSON?字符串为障,不包含其它的接口信息鳍怨,甚至有時候格式也不一致,這對前端不太友好鞋喇,所以我希望把這個返回修改一下侦香,往返回信息里面添加一些額外的信息纽疟,如?狀態(tài)?仰挣,?說明?等信息
首先膘壶,要知道在哪里修改這個返回,翻一下源碼發(fā)現(xiàn)這些返回信息是寫在?create()?颓芭、?list()?、?retrieve()?官紫、?update()?州藕、?destroy()?這些方法里的床玻,這些信息都放在?Response?對象里面返回到前端頁面去锈死。
知道在哪里改后喇勋,接著就是改這些方法的返回信息了川背,我希望給前端返回這樣格式的信息:
{'code': 1, 'msg': '成功', 'errors': {}, 'data': []} # errors 放具體的錯誤信息睦优,data 放返回去的數(shù)據(jù)
然后用這個 dict 直接替換 Response 里面的信息就行了汗盘,如下:
替換后隐孽,嘗試請求下接口健蕊,默認的返回格式就變成我們定義的樣子了缩功,但是嫡锌,任務(wù)還沒完成势木,在只有一個接口的情況下,這樣改改沒什么溯壶,但是如果有十幾個甫男,幾十個接口的話,這樣一個個接口去改又跛,不但累人還不好維護效扫,所以這里換種方法。
我們通過定義一個繼承于 ModelViewSet 的類浩习,然后所有的接口不再繼承 ModelViewSet 而繼承于這個?CustomViewSet?谱秽,這就不用一個個接口去改了疟赊,還方便維護近哟。
到此為止吉执,任務(wù)依然沒有完成戳玫,成功的返回我們是定義好了咕宿,但是接口發(fā)生異常的時候府阀,返回的信息還是默認的那些信息肌似,因為我們改的只是正常處理完成后的成功返回诉瓦,異常返回我們是沒有處理睬澡,那異常信息的返回應(yīng)該在哪里改煞聪?
一頓調(diào)試后斗躏,我發(fā)現(xiàn)了當(dāng)接口發(fā)生異常后,是由?exception_handler?這個方法去處理的昔脯。這個方法定義在?rest_framework/views.py?里啄糙,因為這個方法是獨立出來的笛臣,不是定義在 ModelViewSet 里面,所以就沒辦法通過重寫的方法來改了隧饼,我們把整個方法復(fù)制出來沈堡,放在?CustomViewSet?下面(當(dāng)然沒有規(guī)定要放在一起,放在哪里都行燕雁,方便管理就行)诞丽。
可以看出,第95行到98行就是我們需要改的地方拐格,調(diào)試看一下這個對象是怎樣的僧免,然后進一步把里面我們需要的信息提取出來,改成這個樣子:
最重要的一步!要在?settings.py?里面的?REST_FRAMEWORK?(自己添加的)里添加多一條這樣的配置:
REST_FRAMEWORK = {? ? ······? ? ······? ?
? ? 'EXCEPTION_HANDLER': 'common.views.exception_handler'}復(fù)制代碼
這里指定了使用哪個方法作為接口異常的處理器谒所,這個設(shè)置成我們剛剛改那個姐军。
PS: 雖然做了上面的修改后,就修改了系統(tǒng)上大部分的返回信息惊暴,但是有時候我們需要定一個接口不是繼承 ModelViewSet 的卫病,這樣這些修改就不能繼承到了,在這樣的情況下幽告,每寫一次接口,都要自己手動敲一遍這些信息,難免會手快敲錯了媒殉,在這里我定義了一個類:
那上面的接口就可以改成這個樣子了桃犬,更加的方便維護: