drf API 接口默認(rèn)返回的只是數(shù)據(jù)的JSON字符串,不包含其它的接口信息练湿,甚至有時(shí)候格式也不一致忽肛,這對(duì)前端不太友好法严,所以我希望把這個(gè)返回修改一下损敷,往返回信息里面添加一些額外的信息,如狀態(tài)深啤,說明等信息
首先拗馒,要知道在哪里修改這個(gè)返回,翻一下源碼發(fā)現(xiàn)這些返回信息是寫在create()溯街、list()诱桂、retrieve()、update()呈昔、destroy()這些方法里的挥等,這些信息都放在Response對(duì)象里面返回到前端頁面去。
知道在哪里改后堤尾,接著就是改這些方法的返回信息了肝劲,我希望給前端返回這樣格式的信息:
{'code': 1, 'msg': '成功', 'errors': {}, 'data': []} # errors 放具體的錯(cuò)誤信息,data 放返回去的數(shù)據(jù)
然后用這個(gè) dict 直接替換 Response 里面的信息就行了,如下:
替換后掷漱,嘗試請(qǐng)求下接口,默認(rèn)的返回格式就變成我們定義的樣子了榄檬,但是卜范,任務(wù)還沒完成,在只有一個(gè)接口的情況下鹿榜,這樣改改沒什么海雪,但是如果有十幾個(gè),幾十個(gè)接口的話犬缨,這樣一個(gè)個(gè)接口去改喳魏,不但累人還不好維護(hù),所以這里換種方法怀薛。
我們通過定義一個(gè)繼承于 ModelViewSet 的類刺彩,然后所有的接口不再繼承 ModelViewSet 而繼承于這個(gè) CustomViewSet
,這就不用一個(gè)個(gè)接口去改了枝恋,還方便維護(hù)创倔。
到此為止,任務(wù)依然沒有完成焚碌,成功的返回我們是定義好了畦攘,但是接口發(fā)生異常的時(shí)候,返回的信息還是默認(rèn)的那些信息十电,因?yàn)槲覀兏牡闹皇钦L幚硗瓿珊蟮某晒Ψ祷刂海惓7祷匚覀兪菦]有處理,那異常信息的返回應(yīng)該在哪里改鹃骂?
一頓調(diào)試后台盯,我發(fā)現(xiàn)了當(dāng)接口發(fā)生異常后,是由exception_handler
這個(gè)方法去處理的畏线。這個(gè)方法定義在rest_framework/views.py
里静盅,因?yàn)檫@個(gè)方法是獨(dú)立出來的,不是定義在 ModelViewSet 里面寝殴,所以就沒辦法通過重寫的方法來改了蒿叠,我們把整個(gè)方法復(fù)制出來,放在CustomViewSet
下面(當(dāng)然沒有規(guī)定要放在一起蚣常,放在哪里都行市咽,方便管理就行)。
可以看出抵蚊,第95行到98行就是我們需要改的地方施绎,調(diào)試看一下這個(gè)對(duì)象是怎樣的曼验,然后進(jìn)一步把里面我們需要的信息提取出來,改成這個(gè)樣子:
最重要的一步粘姜!要在settings.py
里面的 REST_FRAMEWORK
(自己添加的)里添加多一條這樣的配置:
REST_FRAMEWORK = {
······
······
'EXCEPTION_HANDLER': 'common.views.exception_handler'
}
這里指定了使用哪個(gè)方法作為接口異常的處理器鬓照,這個(gè)設(shè)置成我們剛剛改那個(gè)。
PS:
雖然做了上面的修改后孤紧,就修改了系統(tǒng)上大部分的返回信息豺裆,但是有時(shí)候我們需要定一個(gè)接口不是繼承 ModelViewSet 的,這樣這些修改就不能繼承到了号显,在這樣的情況下臭猜,每寫一次接口,都要自己手動(dòng)敲一遍這些信息押蚤,難免會(huì)手快敲錯(cuò)了蔑歌,在這里我定義了一個(gè)類:
那上面的接口就可以改成這個(gè)樣子了,更加的方便維護(hù):
總結(jié):
- 自定義一個(gè)繼承于
ModelViewSet
的類揽碘,重寫create次屠、list、update雳刺、retrieve劫灶、destroy這些方法,修改Response - 復(fù)制
rest_framework/views.py/exception_handler
方法掖桦,修改里面處理異常信息的代碼 - 在
settings.py
的REST_FRAMEWORK
配置里面添加'EXCEPTION_HANDLER': 'common.views.exception_handler'
- (可選)新建一個(gè)返回信息類
ResturnMsg
本昏,代替手動(dòng)寫返回信息,避免錯(cuò)誤枪汪。