日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django REST framework 異常處理

瀏覽:35日期:2024-09-03 16:58:22
目錄寫在前面DRF異常處理1. DRF 常見的異常2. 自定義異常3. 使用自定義異常4. 驗(yàn)證結(jié)果異常處理進(jìn)階1. 修改自定義異常2. 自定義更多異常3. 新增測(cè)試接口4. 驗(yàn)證結(jié)果總結(jié)參考資料寫在前面

這兩天一直在思索關(guān)于 DRF 還有哪些是項(xiàng)目必備的而且還沒有說到的基礎(chǔ)性的知識(shí)。這不昨天寫到日志相關(guān)的功能就直接想到還有異常處理相關(guān)的功能,其實(shí)在之前項(xiàng)目中初期是沒有統(tǒng)一的異常捕獲手段。可能是 DRF 自帶的異常 能滿足大多數(shù)功能,也可能是比較懶,就使用比較粗暴的方式,以狀態(tài)碼 500 的方式去拋出異常,然后在日志中可以看到所有的異常信息。這么做呢,代碼其實(shí)是不夠健壯的,前端在調(diào)用的時(shí)候莫名的 500 也是不夠友好的,所以今天就補(bǔ)充一下異常相關(guān)的知識(shí)。

DRF異常處理1. DRF 常見的異常 AuthenticationFailed/ NotAuthenticated 一般該異常狀態(tài)碼為'401 Unauthenticated',主要是沒有登錄鑒權(quán)的時(shí)候會(huì)返回,可以用在自定義登錄的時(shí)候。 PermissionDenied 一般用在鑒權(quán)時(shí)候使用,一般狀態(tài)碼為'403 Forbidden'。 ValidationError 一般狀態(tài)碼為'400 Bad Request',主要是 serializers 中對(duì)字段的校驗(yàn),比如對(duì)字段類型的校驗(yàn)、字段長(zhǎng)度的校驗(yàn)以及自定義字段格式的校驗(yàn)。2. 自定義異常

這里對(duì)異常的定義主要的想法來自 ValidationError,統(tǒng)一異常返回的格式,方便前端統(tǒng)一處理類似異常。

自定義異常

# 新建 utils/custom_exception.pyclass CustomException(Exception): _default_code = 400 def __init__(self,message: str = '',status_code=status.HTTP_400_BAD_REQUEST,data=None,code: int = _default_code, ):self.code = codeself.status = status_codeself.message = messageif data is None: self.data = {'detail': message}else: self.data = data def __str__(self):return self.message

自定義異常處理

# utils/custom_exception.pyfrom rest_framework.views import exception_handlerdef custom_exception_handler(exc, context): # Call REST framework’s default exception handler first, # to get the standard error response.# 這里對(duì)自定義的 CustomException 直接返回,保證系統(tǒng)其他異常不受影響 if isinstance(exc, CustomException):return Response(data=exc.data, status=exc.status) response = exception_handler(exc, context) return response

配置自定義異常處理類

REST_FRAMEWORK = { # ... 'EXCEPTION_HANDLER': 'utils.custom_exception.custom_exception_handler',}3. 使用自定義異常

使用之前文章的接口用來測(cè)試自定義異常的處理

class ArticleViewSet(viewsets.ModelViewSet): ''' 允許用戶查看或編輯的API路徑。 ''' queryset = Article.objects.all() serializer_class = ArticleSerializer @action(detail=False, methods=['get'], url_name='exception', url_path='exception') def exception(self, request, *args, **kwargs):# 日志使用 demologger.error('自定義異常')raise CustomException(data={'detail': '自定義異常'})4. 驗(yàn)證結(jié)果

$ curl -H ’Accept: application/json; indent=4’ -u admin:admin http://127.0.0.1:8000/api/article/exception/{ 'detail': '自定義異常'}異常處理進(jìn)階

上面的代碼雖說是可以滿足90%的需求,但是錯(cuò)誤的定義太泛泛。難以集中定義管理錯(cuò)誤,與常見項(xiàng)目中自定義的異常比較優(yōu)點(diǎn)就是靈活,但是隨著代碼中拋出的異常越來越多加之散落在各個(gè)角落,不利于更新維護(hù)。所以下面對(duì)修改一下代碼,對(duì)異常有統(tǒng)一的定義,同時(shí)也支持自定義返回HTTP狀態(tài)碼。

1. 修改自定義異常

# utils/custom_exception.pyclass CustomException(Exception): # 自定義code default_code = 400 # 自定義 message default_message = None def __init__( self, status_code=status.HTTP_400_BAD_REQUEST, code: int = None, message: str = None, data=None, ):self.status = status_codeself.code = self.default_code if code is None else codeself.message = self.default_message if message is None else messageif data is None: self.data = {'detail': self.message, 'code': self.code}else: self.data = data def __str__(self):return str(self.code) + self.message2. 自定義更多異常

class ExecuteError(CustomException): '''執(zhí)行出錯(cuò)''' default_code = 500 default_message = '執(zhí)行出錯(cuò)'class UnKnowError(CustomException): '''執(zhí)行出錯(cuò)''' default_code = 500 default_message = '未知出錯(cuò)'3. 新增測(cè)試接口

class ArticleViewSet(viewsets.ModelViewSet): ''' 允許用戶查看或編輯的API路徑。 ''' queryset = Article.objects.all() serializer_class = ArticleSerializer @action(detail=False, methods=['get'], url_name='exception', url_path='exception') def exception(self, request, *args, **kwargs):# 日志使用 demologger.error('自定義異常')raise CustomException(data={'detail': '自定義異常'}) @action(detail=False, methods=['get'], url_name='unknown', url_path='unknown') def unknown(self, request, *args, **kwargs):# 日志使用 demologger.error('未知錯(cuò)誤')raise UnknownError() @action(detail=False, methods=['get'], url_name='execute', url_path='execute') def execute(self, request, *args, **kwargs):# 日志使用 demologger.error('執(zhí)行錯(cuò)誤')raise ExecuteError()4. 驗(yàn)證結(jié)果

curl -H ’Accept: application/json; indent=4’ -u admin:admin http://127.0.0.1:8000/api/article/unknown/{ 'detail': '未知出錯(cuò)', 'code': 500}$ curl -H ’Accept: application/json; indent=4’ -u admin:admin http://127.0.0.1:8000/api/article/execute/{ 'detail': '執(zhí)行出錯(cuò)', 'code': 500}總結(jié)

需要注意自定義的異常處理函數(shù)需要在處理完成自定義異常后繼續(xù)執(zhí)行 rest_framework.views.exception_handler,因?yàn)檫@里的執(zhí)行仍然需要兼容已有的異常處理;下面貼一下 DRF 有關(guān)的異常處理邏輯。

該處理函數(shù)默認(rèn)處理 APIException以及 Django 內(nèi)部的 Http404 PermissionDenied,其他的異常會(huì)返回 None ,會(huì)觸發(fā) DRF 500 的錯(cuò)誤。

def exception_handler(exc, context): ''' Returns the response that should be used for any given exception. By default we handle the REST framework `APIException`, and also Django’s built-in `Http404` and `PermissionDenied` exceptions. Any unhandled exceptions may return `None`, which will cause a 500 error to be raised. ''' if isinstance(exc, Http404):exc = exceptions.NotFound() elif isinstance(exc, PermissionDenied):exc = exceptions.PermissionDenied() if isinstance(exc, exceptions.APIException):headers = {}if getattr(exc, ’auth_header’, None): headers[’WWW-Authenticate’] = exc.auth_headerif getattr(exc, ’wait’, None): headers[’Retry-After’] = ’%d’ % exc.waitif isinstance(exc.detail, (list, dict)): data = exc.detailelse: data = {’detail’: exc.detail}set_rollback()return Response(data, status=exc.status_code, headers=headers) return None參考資料

Django REST framework 異常文檔Django 異常文檔

到此這篇關(guān)于Django REST framework 異常處理的文章就介紹到這了,更多相關(guān)Django REST framework 異常內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品推荐| 日韩精品91| 一区二区国产精品| 亚洲精品在线a| 欧美日韩亚洲一区三区| 日本高清久久| 国模精品一区| 欧美日韩在线观看视频小说| 久久久777| 亚洲制服欧美另类| 国产精品激情电影| 国产伦理久久久久久妇女| 欧美激情91| 激情综合网五月| 吉吉日韩欧美| 久久一区二区三区喷水| 中文一区在线| 97精品中文字幕| 日韩精品成人| 蜜臀久久99精品久久一区二区| 国产探花在线精品| 美女久久一区| 亚洲女同一区| 91精品综合| 国产一区二区三区四区大秀| 日本精品久久| 亚洲一级特黄| 97在线精品| 电影91久久久| 免费日韩成人| 国产精品中文字幕亚洲欧美 | 久久精品国产大片免费观看| 日韩av不卡在线观看| 免费一级片91| 香蕉久久国产| 丝袜美腿亚洲一区二区图片| 欧美精品一卡| 怡红院精品视频在线观看极品| 国产另类在线| 欧美日韩午夜| 一区二区高清| 免费人成在线不卡| 黑丝一区二区三区| 日韩精品免费一区二区三区| 国产福利资源一区| 日韩av中文在线观看| 亚洲一区欧美| 欧美美女一区| 欧美成人亚洲| 91精品国产调教在线观看| 精品国产三区在线| 欧美国产不卡| 日韩av中文在线观看| 丝袜a∨在线一区二区三区不卡| 日韩久久精品网| 999精品色在线播放| 91日韩欧美| 午夜精品成人av| 日韩国产欧美| 欧美成人综合| 蜜臀a∨国产成人精品| 男女男精品视频网| 亚洲另类av| **爰片久久毛片| 国产精品亚洲人成在99www| 国产欧美一区二区色老头| 欧美中文高清| 国产精品国产三级在线观看| 日韩和欧美一区二区| 青青伊人久久| 精品黄色一级片| 日韩欧美一区二区三区免费看| 欧洲av一区二区| 蜜桃av一区二区在线观看| 欧美中文一区| 久久久久久夜| 99国产成+人+综合+亚洲欧美| 亚洲精品动态| 精品国产欧美日韩| 欧美精品一区二区三区精品| 免费人成精品欧美精品| 国产精品mm| 亚洲欧美日韩高清在线| 视频在线观看一区二区三区| 欧美一区精品| 亚洲高清成人| 国产精品久久久久久久久久白浆| www在线观看黄色| 欧美资源在线| 国产精品毛片久久| 亚久久调教视频| 日本精品不卡| 国产欧美日韩一区二区三区四区| 久久精品电影| 国产精品一区二区三区四区在线观看| 日韩成人三级| 久久激情五月婷婷| 亚洲主播在线| 四虎成人av| 日韩午夜视频在线| 久久人人88| 水蜜桃久久夜色精品一区| 日本成人在线一区| 久久国产高清| 欧美色图一区| 在线天堂中文资源最新版| 国产三级一区| 亚洲精品乱码| 日韩中文字幕麻豆| 成人羞羞视频在线看网址| 国产精品九九| 国产探花一区在线观看| 亚洲欧美在线综合| 蜜桃视频免费观看一区| 国产高清不卡| 国产suv精品一区| 国产一区二区三区精品在线观看| 欧美日韩夜夜| 国产精品一在线观看| 久久国内精品自在自线400部| 亚洲影院天堂中文av色| 亚洲深深色噜噜狠狠爱网站 | 欧美一区精品| 91国内精品| 日本aⅴ亚洲精品中文乱码| 亚洲精品第一| 日韩高清三区| 亚洲丝袜美腿一区| 中文字幕一区二区三区四区久久 | 亚久久调教视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久一区二区三区电影| 四虎4545www国产精品| 黄色网一区二区| av在线日韩| 亚洲欧美网站| 青青草国产成人99久久| 国产精品xxx在线观看| 色婷婷综合网| 欧美一区二区三区高清视频| 午夜久久福利| 日韩av黄色在线| 精品一区二区三区中文字幕| 视频在线不卡免费观看| 欧美日韩精品免费观看视频完整| 免费视频久久| 久久福利在线| 亚洲不卡av不卡一区二区| 亚洲午夜久久久久久尤物| 亚洲欧美久久| 精品中文字幕一区二区三区四区| 婷婷激情一区| 日韩高清电影免费| 亚洲黄色免费av| 视频精品一区二区| 你懂的国产精品| 波多野结衣一区| 国产精品免费99久久久| 99成人在线视频| 欧美日韩 国产精品| 免费国产自久久久久三四区久久| 日韩毛片一区| 天堂网av成人| 亚洲欧美专区| 激情综合网站| 久久男人天堂| 久久国产尿小便嘘嘘| 九九综合九九| 中文字幕色婷婷在线视频| 亚洲毛片一区| 91高清一区| 亚洲播播91| 久久精品国产999大香线蕉 | 黄色欧美在线| 国产精品一区二区中文字幕| 在线亚洲一区| 日韩综合精品| 色黄视频在线观看| 欧美激情在线精品一区二区三区| 中文字幕日本一区二区| 亚洲激情二区| 91精品99| 亚洲一区国产| 亚洲美洲欧洲综合国产一区| 日本久久成人网| 最近高清中文在线字幕在线观看1| 欧美一区自拍| 欧美一区影院| 国产精品密蕾丝视频下载| 日韩中文一区二区| 久久福利精品| 欧美日韩精品免费观看视频完整| 四虎4545www国产精品| 国产高清不卡| 亚洲天堂一区二区| 欧美99久久| 免费久久99精品国产自在现线| 国产亚洲一级| 亚洲精品乱码日韩| 国产精品伊人|