日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Django?RestFramework?全局異常處理詳解_python

作者:桔子檸檬水 ? 更新時間: 2022-04-30 編程語言

REST framework定義的異常

  • APIException 所有異常的父類
  • ParseError 解析錯誤
  • AuthenticationFailed 認證失敗
  • NotAuthenticated 尚未認證
  • PermissionDenied 權限決絕
  • NotFound 未找到
  • MethodNotAllowed 請求方式不支持
  • NotAcceptable 要獲取的數據格式不支持
  • Throttled 超過限流次數
  • ValidationError 校驗失敗

一、定義異常處理類

from django.http import JsonResponse
from rest_framework.views import exception_handler as drf_exception_handler
import logging
from django.db import DatabaseError
from redis.exceptions import RedisError
import traceback
# 獲取在配置文件中定義的logger,用來記錄日志
logger = logging.getLogger('django')

def exception_handler(exc, context):
    """
    自定義異常處理
    :param exc: 異常
    :param context: 拋出異常的上下文(包含request請求對象和view視圖對象)
    :return: Response響應對象
    """
    # 調用drf框架原生的異常處理方法
    response = drf_exception_handler(exc, context)
    if response is not None:
    	logger.info('REST_FRAMEWORK處理異常')
    	# 使用自定義封裝好的方法處理數據格式并返回給前端
        return response_util.success(response)
    view = context['view']
    # 打印異常類以及異常的文本信息
    logger.error('[%s] %s' % (view, exc))
    returnData = {
        'code': 500,
        'msg': '服務器錯誤',
        'data': ""
    }
    # 捕獲其他異常,直接返回 500
    if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
        # 數據庫異常,使用traceback.format_exc()可以像系統報錯沒攔截那樣子打印詳細錯誤信息又不會導致程序停止
        logger.error(f'其他未知錯誤:{traceback.format_exc()}')
        # 使用django原生的響應對象返回,不能用DRF框架的響應對象
        return JsonResponse(data=returnData, status=500)
    else:
        # 打印錯誤詳細信息
        logger.error(f'其他未知錯誤:{traceback.format_exc()}')
        # 使用django原生的響應對象返回,不能用DRF框架的響應對象
        return JsonResponse(data=returnData, status=500)

二、注冊DRF框架中默認的錯誤處理為自己定義的類

在settings.py文件中定義

REST_FRAMEWORK = {
    # 異常處理
    'EXCEPTION_HANDLER': 'meiduo_service.utils.excepitons.exception_handler',
}

修改django默認處理了錯誤對象類似,將錯誤處理對象改為用中間件即可,處理的邏輯思路一樣,不過類以及設置方法不一樣而已

總結

原文鏈接:https://blog.csdn.net/s_mitsuha/article/details/123143071

欄目分類
最近更新