修改 Django Rest framework ModelViewSet 的默認(rèn)返回信息

drf API 接口默認(rèn)返回的只是數(shù)據(jù)的JSON字符串,不包含其它的接口信息练湿,甚至有時(shí)候格式也不一致忽肛,這對(duì)前端不太友好法严,所以我希望把這個(gè)返回修改一下损敷,往返回信息里面添加一些額外的信息,如狀態(tài)深啤,說明等信息

首先拗馒,要知道在哪里修改這個(gè)返回,翻一下源碼發(fā)現(xiàn)這些返回信息是寫在create()溯街、list()诱桂、retrieve()update()呈昔、destroy()這些方法里的挥等,這些信息都放在Response對(duì)象里面返回到前端頁面去。

image
image
image
image
image

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

{'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ù)创倔。

image

到此為止,任務(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ī)定要放在一起蚣常,放在哪里都行市咽,方便管理就行)。

image

可以看出抵蚊,第95行到98行就是我們需要改的地方施绎,調(diào)試看一下這個(gè)對(duì)象是怎樣的曼验,然后進(jìn)一步把里面我們需要的信息提取出來,改成這個(gè)樣子:

image

最重要的一步粘姜!要在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è)類:

image

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

image

總結(jié):

  1. 自定義一個(gè)繼承于ModelViewSet的類揽碘,重寫create次屠、listupdate雳刺、retrieve劫灶、destroy這些方法,修改Response
  2. 復(fù)制rest_framework/views.py/exception_handler方法掖桦,修改里面處理異常信息的代碼
  3. settings.pyREST_FRAMEWORK配置里面添加'EXCEPTION_HANDLER': 'common.views.exception_handler'
  4. (可選)新建一個(gè)返回信息類ResturnMsg本昏,代替手動(dòng)寫返回信息,避免錯(cuò)誤枪汪。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涌穆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雀久,更是在濱河造成了極大的恐慌宿稀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸啡,死亡現(xiàn)場(chǎng)離奇詭異原叮,居然都是意外死亡赫编,警方通過查閱死者的電腦和手機(jī)巡蘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擂送,“玉大人悦荒,你說我怎么就攤上這事∴诙郑” “怎么了搬味?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我碰纬,道長(zhǎng)萍聊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任悦析,我火速辦了婚禮寿桨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘强戴。我一直安慰自己亭螟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布骑歹。 她就那樣靜靜地躺著预烙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪道媚。 梳的紋絲不亂的頭發(fā)上扁掸,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音最域,去河邊找鬼也糊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛羡宙,可吹牛的內(nèi)容都是我干的狸剃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼狗热,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼钞馁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匿刮,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤僧凰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后熟丸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體训措,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年光羞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绩鸣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纱兑,死狀恐怖呀闻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潜慎,我是刑警寧澤捡多,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布蓖康,位于F島的核電站,受9級(jí)特大地震影響垒手,放射性物質(zhì)發(fā)生泄漏灾茁。R本人自食惡果不足惜梆暮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一晤愧、第九天 我趴在偏房一處隱蔽的房頂上張望振定。 院中可真熱鬧,春花似錦唆迁、人聲如沸鸭丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞溉。三九已至,卻和暖如春鼠哥,著一層夾襖步出監(jiān)牢的瞬間熟菲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工朴恳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抄罕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓于颖,卻偏偏與公主長(zhǎng)得像呆贿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子森渐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 視圖集ViewSet 視圖集的繼承關(guān)系 兩個(gè)基本視圖集 ViewSet在ViewSet中做入,沒有提供任何動(dòng)作acti...
    3e0693dcfb2f閱讀 1,421評(píng)論 0 2
  • 一、簡(jiǎn)歷準(zhǔn)備 1同衣、個(gè)人技能 (1)自定義控件竟块、UI設(shè)計(jì)、常用動(dòng)畫特效 自定義控件 ①為什么要自定義控件耐齐? Andr...
    lucas777閱讀 5,187評(píng)論 2 54
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 上周四浪秘,對(duì)全球漫威迷來說都是個(gè)沉重的日子〔嚎觯“漫威之父”斯坦李的妻子耸携,95歲的瓊安李在家人的陪伴下離開了人世。她和斯...
    CNYPOSTURE閱讀 405評(píng)論 0 1
  • #365天自我挑戰(zhàn)#第2天 文/小齊同學(xué) 坐在驕陽似火的泉城廣場(chǎng)中間询枚,聽著那歡快的廣場(chǎng)舞舞曲违帆,我想起了一個(gè)人浙巫,那是...
    小齊同學(xué)閱讀 505評(píng)論 0 7