REST framework 異常模組

2021-10-02 19:39:42 字數 2543 閱讀 3783

1)所有經過drf的apiview檢視類產生的異常,都可以提供異常處理方案

2)drf預設提供了異常處理方案(rest_framework.views.exception_handler),但是處理範圍有限

3)drf提供的處理方案兩種,處理了返回異常現象,沒處理返回none(後續就是伺服器拋異常給前台)

4)自定義異常的目的就是解決drf沒有處理的異常,讓前台得到合理的異常資訊返回,後台記錄異常具體資訊

ps:orm查詢時的錯誤drf不會自動處理

原始碼入口:

apiview類的dispatch方法中 response = self.handle_exception(exc)   點進去

原始碼解析;

# 獲取處理異常的控制代碼(方法)

# 一層層看原始碼,走的是配置檔案,拿到的是rest_framework.views的exception_handler

# 自定義:直接寫exception_handler函式,在自己的配置檔案配置exception_handler指向自己的

exception_handler = self.get_exception_handler()

​# 異常處理的結果

# 自定義異常就是提供exception_handler異常處理函式,處理的目的就是讓response一定有值

response = exception_handler(exc, context)

在settings.py檔案中配置

rest_framework = 

注: utils是自建的資料夾,裡面是自己寫的封裝功能

utils/exception.py檔案

from rest_framework.views import exception_handler as drf_exception_handler

from rest_framework.response import response

from rest_framework import status

​def exception_handler(exc, context):

# 1.先讓drf的exception_handler做基礎處理,拿到返回值

# 2.若有返回值則drf處理了,若返回值為空說明drf沒處理,需要我們手動處理

response = drf_exception_handler(exc, context)

print(exc) # 錯誤內容 'nonetype' object has no attribute 'title'

print(context)

# , 'request': }

print(response)

# 返回值為空,做二次處理

from utils.logging import logger # 自己封裝的logger

from utils.response import apiresponse # 自己封裝的響應模組

def exception_handler(exc, context):

response = drf_exception_handler(exc, context)

if response is none:

logger.error('%s - %s - %s' % (context['view'], context['request'].method, exc))

return apiresponse(3, '異常',

)return apiresponse(3, '異常', results=response.data, http_status=status.http_401_unauthorized)

學習週報 rest framework

本週學習情況 1.rest framework的學習 2.前後端分離5 2到5 6 下週學習計畫 停止課程內容學習 2.花10學習rest framework基礎的學習 本週完成情況 一 fbv,cbv 繼承 避免重複 1 優先順序從左往右 2 super 1.先在studentsview裡面查詢,...

rest framework登入認證

class user models.model user models.charfield max length 32 pwd models.charfield max length 32 class usertoken models.model token models.charfield max...

REST framework 渲染模組

根據 使用者請求url 或 使用者可接受的型別,篩選出合適的 渲染元件。頁面 postman from rest framework.renderers import jsonrenderer from rest framework.renderers import browsableapirend...