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...