国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DRF:配置全局異常處理和日志結(jié)合

這篇具有很好參考價值的文章主要介紹了DRF:配置全局異常處理和日志結(jié)合。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

項目目錄結(jié)構(gòu)

---study_drf

? ? ? ? ---study_drf

? ? ? ? ? ? ? ? ---settings.py

? ? ? ? ---utils

? ? ? ? ? ? ? ? ---log.py

? ? ? ? ? ? ? ? ---exception.py

項目依賴

Django==3.2
django-cors-headers==3.5.0
djangorestframework==3.12.2
djangorestframework-jwt==1.11.0
mysqlclient==2.1.1
pinyin==0.4.0 #拼音處理
PyJWT==1.7.1
fpdf==1.7.2 #生成pdf文件
APScheduler==3.10.1 #輕量級定時任務(wù)
redis==4.6.0  #操作redis數(shù)據(jù)庫的

要使用drf的Response做為響應(yīng)對象,需要先注冊app

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',#使用rest_framework的Response需要注冊
]

一、utils/log.py

1、setting.py配置日志

#######--配置日志,
#1、配置日志要保存的文件夾,創(chuàng)建文件夾
import time
BASE_LOG_DIR = os.path.join(BASE_DIR, 'logs')
ERROR_PATH_DIR = os.path.join(BASE_LOG_DIR,'error')
if not os.path.exists(ERROR_PATH_DIR):
    #如果logs/error/不存在,遞歸創(chuàng)建目錄
    os.makedirs(ERROR_PATH_DIR)

ALL_PATH_DIR = os.path.join(BASE_LOG_DIR,'all')
if not os.path.exists(ALL_PATH_DIR):
    #如果logs/all/目錄不存在,就遞歸創(chuàng)建(如果logs目錄不存在,也會創(chuàng)建)
    os.makedirs(ALL_PATH_DIR)

#2、相關(guān)的日志配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 設(shè)置已存在的logger不失效
    'filters': {
    },
    'formatters': {
        'standard': {
            'format': '[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d:%(funcName)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'simple': {
            'format': '[%(asctime)s][%(levelname)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': { #按照文件大小分割日志,將所有的日志信息都保存在這里
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_LOG_DIR,'all', 'debug.log'),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小50M
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        #os.path.join(BASE_LOG_DIR,'error',f"{time.strftime('%Y-%m-%d')}.log")
        'time_file':{#按照時間分割日志,每周一新增一個日志文件,存error等級以上的日志
              'level': 'INFO',#日志的等級
              'class': 'logging.handlers.TimedRotatingFileHandler',
              'filename':os.path.join(BASE_LOG_DIR,'error',f"{time.strftime('%Y-%m-%d')}.log") ,#日志的文件名
              'when': 'D', #時間單位,S,M,H,D,'W0'(星期1),'W6'(星期天)
              'interval': 1,
              'backupCount': 5, #備份數(shù)量
              'formatter': 'standard', #使用的日志格式
              'encoding': 'utf-8',
        }

    },
    'loggers': {
        #INFO以上日志,打印在console,也寫到以文件大小分割的日志中
        'django': {
            'handlers': ['console','file'],#handlers中存在的配置
            'level': 'INFO',
            'propagate': True
        },
        #error以上的日志寫到按時間分割的日志文件中,同時打印在控制臺
        'django.request': {
            'handlers': ['time_file'],#handlers中存在的配置
            'level': 'ERROR',
            'propagate': True
        },

    },
}

2、utils/log.py,拿到配置的日志處理對象,實現(xiàn)手動記錄日志

#手動寫日志
import logging

info_logger = logging.getLogger('django') #根據(jù)loggers配置handlers,將日志寫到指定的地方
error_logger = logging.getLogger('django.request') #根據(jù)loggers配置handlers,將日志寫到指定的地方

if __name__ == '__main__':
    #簡單的使用例子,使用這個方法記錄日志,可以記錄詳細(xì)的日志信息(在視圖中使用)
    error_logger.exception(f'{__file__}/Test_log,method=post,error,django.request')

二、utils/exception.py

1.1、重寫自己的drf全局異常模塊

from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
from utils.log import error_logger #寫日志

#配置drf的全局異常處理,需要在settings中配置
def _exception_handler(exc,context):
    #exc是報錯的異常對象,context是哪個模塊的函數(shù)出現(xiàn)報錯
    response = exception_handler(exc,context)
    # print(exc.detail.get('error'),exc.detail.get('code'))
    # print(exc,'異常對象')
    # print(context,'報錯函數(shù)')
    # print(response,'返回對象')
    #response有兩個結(jié)果:一個是None(系統(tǒng)處理),一個django處理后(但格式不符合要求)
    if not response:
        #當(dāng)然可以在這里進行精細(xì)的捕獲

        #將錯誤信息寫到日志文件中,使用這個方法,可以把更多信息記錄起來(不要使用error方法,記錄的信息不詳細(xì))
        error_logger.exception(exc)
        return Response(data={'error':'系統(tǒng)內(nèi)部錯誤,請稍后再重試','code':500},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    else:
        #djang處理的
        if type(response.data) == dict:
            detail = response.data.get('detail')
        elif type(response.data) == list:
            #特殊情況處理
            detail = response.data
            if len(detail) <=1:
                return Response(data={'error':detail[0], 'code': 400},
                                status=response.status_code)
            else:
                return Response(data={'error': detail, 'code': 416},
                                status=response.status_code)
        else:
            detail = response.data
        if detail:
            if '未找到。' == detail:
                detail = '查詢不到該數(shù)據(jù)信息'
            if '無效頁面。' == detail:
                detail = '該頁面的數(shù)據(jù)查詢不到,請確定要查詢的頁面數(shù)據(jù)是否存在'
            return Response(data={'error':detail,'code':400},status=response.status_code)
        else:
            #我在寫認(rèn)證時,raise AuthenticationFailed({'code': 410, 'msg': msg,'type':'報錯'})
            #拿到這里拋出異常的信息和code
            return Response(data={'error':exc.detail.get('error'),'code':exc.detail.get('code')},status=response.status_code)

1.2、settings.py 在配置文件中使用全局異常處理文章來源地址http://www.zghlxwxcb.cn/news/detail-523498.html

#### drf的配置,全局配置
REST_FRAMEWORK = {

    #2、配置全局異常處理
    'EXCEPTION_HANDLER': 'utils.exception._exception_handler',


}

到了這里,關(guān)于DRF:配置全局異常處理和日志結(jié)合的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python Django 之全局配置 settings 詳解

    Python Django 之全局配置 settings 詳解

    對應(yīng)項目下的 apps.py 文件,如: 在根目錄下添加 templates 文件夾,可實現(xiàn)跳轉(zhuǎn)至對應(yīng)名稱的 HTML 頁面 方式1:項目內(nèi)創(chuàng)建 static 文件夾 方式2:項目外創(chuàng)建 static 文件夾

    2024年02月08日
    瀏覽(16)
  • Spring Boot學(xué)習(xí)隨筆- 后端實現(xiàn)全局異常處理(HandlerExceptionResolver),前后端解決跨域問題(@CrossOrigin(局部解決)自定義跨域配置類(全局))

    Spring Boot學(xué)習(xí)隨筆- 后端實現(xiàn)全局異常處理(HandlerExceptionResolver),前后端解決跨域問題(@CrossOrigin(局部解決)自定義跨域配置類(全局))

    學(xué)習(xí)視頻:【編程不良人】2021年SpringBoot最新最全教程 異常處理作用:用來解決整合系統(tǒng)中任意一個控制器拋出異常時的統(tǒng)一處理入口 傳統(tǒng)單體架構(gòu)下的處理方式 配置全局異常處理類 resolveException :當(dāng)控制器方法出現(xiàn)異常時,如果該方法沒有try...catch,則會進入當(dāng)前方法 針

    2024年02月04日
    瀏覽(95)
  • 面試之 Python 框架 Flask、Django、DRF

    面試之 Python 框架 Flask、Django、DRF

    Django:大而全的框架。它的內(nèi)部組件比較多,如 ORM、Admin、中間件、Form、ModelForm、Session、緩存、信號、CSRF等,功能也都很完善。 flask:微型框架,內(nèi)部組件就比較少了,但是有很多第三方組件來擴展它,比如 wtform(與django的modelform類似,表單驗證)、flask-sqlalchemy(操作數(shù)

    2024年02月05日
    瀏覽(20)
  • 5.使用日志+自定義全局異常過濾器

    5.使用日志+自定義全局異常過濾器

    剛開始寫文章,封裝Base基類的時候,添加了trycatch異常塊,不過當(dāng)時沒有去記錄日志,直接return了。有小伙伴勸我不要吃了Exception ?其實沒有啦,項目剛開始,我覺得先做好整體結(jié)構(gòu)比較好。像是蓋樓一樣。先把樓體建造出來,然后再一步一步的美化完善。 基礎(chǔ)的倉儲模式已

    2024年02月08日
    瀏覽(19)
  • springboot全局異常處理和自定義異常處理

    在spring項目中,優(yōu)雅處理異常,好處是可以將系統(tǒng)產(chǎn)生的全部異常統(tǒng)一捕獲處理,自定義的異常也由全局異常來捕獲,如果涉及到validator參數(shù)校驗器使用全局異常捕獲也是較為方便。 GlobalExceptionHandler類: 自定義異常CustomException類: 通用返回類:AjaxResult 枚舉類ResultCodeEnum:

    2024年02月04日
    瀏覽(16)
  • 【AntDesign】封裝全局異常處理-全局?jǐn)r截器

    【AntDesign】封裝全局異常處理-全局?jǐn)r截器

    目錄 場景 1 定義全部異常處理類 2 替換request引用 3 代碼優(yōu)化 總結(jié) 本文前端用的是阿里的Ant-Design框架,其他框架也有全局?jǐn)r截器,思路是相同,具體實現(xiàn)自行百度下吧 因為每次都需要調(diào)接口,都需要單獨處理異常情況(code !=0),因此前端需要對后端返回的通用響應(yīng)進行統(tǒng)

    2024年02月08日
    瀏覽(21)
  • Spring MVC異常處理【單個控制異常處理器、全局異常處理器、自定義異常處理器】

    Spring MVC異常處理【單個控制異常處理器、全局異常處理器、自定義異常處理器】

    目錄 一、單個控制器異常處理 1.1 控制器方法 1.2 編寫出錯頁面 1.3 測試結(jié)果 二、全局異常處理 2.1 一個有異常的控制器類 2.2 全局異常處理器類 2.3 測試結(jié)果? 三、自定義異常處理器 3.1 自定義異常處理器 3.2 測試結(jié)果 往期專欄文章相關(guān)導(dǎo)讀? 1. Maven系列專欄文章 2. Mybatis系列

    2024年02月16日
    瀏覽(29)
  • SpringBoot 全局異常統(tǒng)一處理:BindException(綁定異常)

    SpringBoot 全局異常統(tǒng)一處理:BindException(綁定異常)

    在Spring Boot應(yīng)用中,數(shù)據(jù)綁定是一個至關(guān)重要的環(huán)節(jié),它負(fù)責(zé)將HTTP請求中的參數(shù)映射到控制器方法的入?yún)ο笊?。在這個過程中如果遇到問題,如參數(shù)缺失、類型不匹配或驗證失敗等,Spring MVC將會拋出一個 org.springframework.validation.BindException 異常。本文將深入解析 BindExceptio

    2024年01月18日
    瀏覽(19)
  • SpringBoot全局異常處理源碼

    SpringBoot全局異常處理源碼

    今天這里敘述的全局異常處理是SpringBoot在Servlet場景下的處理機制,重點是 Servlet 模式,當(dāng)然 WEBFLUX 今天不做過多描述,SpringBoot2.2.x以后引入的一種響應(yīng)式web開發(fā),在SpringBoot啟動類中可以看到: deduceFromClasspath 方法: 既然是SringBoot的webServlet場景,自然不可以放過的就是 Dis

    2024年02月07日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包