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

您的位置:首頁技術文章
文章詳情頁

Django REST framework 異常處理

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

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

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

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

自定義異常

# 新建 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.# 這里對自定義的 CustomException 直接返回,保證系統其他異常不受影響 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. 使用自定義異常

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

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. 驗證結果

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

上面的代碼雖說是可以滿足90%的需求,但是錯誤的定義太泛泛。難以集中定義管理錯誤,與常見項目中自定義的異常比較優點就是靈活,但是隨著代碼中拋出的異常越來越多加之散落在各個角落,不利于更新維護。所以下面對修改一下代碼,對異常有統一的定義,同時也支持自定義返回HTTP狀態碼。

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): '''執行出錯''' default_code = 500 default_message = '執行出錯'class UnKnowError(CustomException): '''執行出錯''' default_code = 500 default_message = '未知出錯'3. 新增測試接口

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('未知錯誤')raise UnknownError() @action(detail=False, methods=['get'], url_name='execute', url_path='execute') def execute(self, request, *args, **kwargs):# 日志使用 demologger.error('執行錯誤')raise ExecuteError()4. 驗證結果

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

需要注意自定義的異常處理函數需要在處理完成自定義異常后繼續執行 rest_framework.views.exception_handler,因為這里的執行仍然需要兼容已有的異常處理;下面貼一下 DRF 有關的異常處理邏輯。

該處理函數默認處理 APIException以及 Django 內部的 Http404 PermissionDenied,其他的異常會返回 None ,會觸發 DRF 500 的錯誤。

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 異常文檔

到此這篇關于Django REST framework 異常處理的文章就介紹到這了,更多相關Django REST framework 異常內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线日韩中文| 97精品久久| 精品视频97| 国产精品1区| 国产精品男女| 久久国产婷婷国产香蕉| 国产精品一站二站| 国产精品激情| 精品一区二区三区的国产在线观看| 国产精品男女| 久久香蕉精品香蕉| 久久久91麻豆精品国产一区| 婷婷精品在线观看| 欧美久久亚洲| 麻豆视频久久| 成人午夜在线| 午夜欧美巨大性欧美巨大| 久久精品免费一区二区三区 | 综合在线一区| 日韩福利视频一区| 国产精品一区二区三区www| 欧美日韩国产一区二区在线观看| 日韩一区二区三区四区五区| 国产亚洲精品精品国产亚洲综合 | 日韩高清成人在线| 国产精品白丝一区二区三区| 精品99在线| 99精品综合| 在线国产精品一区| 91精品国产自产观看在线 | 国产a久久精品一区二区三区| 日韩在线短视频| 国产精品丝袜xxxxxxx| 亚洲欧美日韩视频二区| 亚洲我射av| 国产精品99精品一区二区三区∴| 欧美xxxx中国| 一区久久精品| 欧美啪啪一区| 国产中文在线播放| 国产精品三上| 国产精品观看| 久久九九电影| 日韩精品高清不卡| 成午夜精品一区二区三区软件| 深夜视频一区二区| 日韩综合一区二区| 中文在线а√在线8| 国产综合视频| 欧美视频精品全部免费观看| 四虎4545www国产精品| 一区二区精品| 久久久久久久欧美精品| 精品久久久网| 亚洲一级影院| 日韩精品1区2区3区| 捆绑调教日本一区二区三区| 久久成人精品| 精品免费视频| 亚洲一区二区网站| 久久久久亚洲精品中文字幕| 日韩亚洲精品在线| 久久av网站| 伊人久久大香线蕉av超碰演员| 国产日产一区| 久久亚洲国产| 欧美一区二区三区久久| 99久久精品网站| 国产麻豆一区二区三区精品视频| 久久久影院免费| 国产精品最新| 午夜在线精品偷拍| 精品视频亚洲| 一区二区三区四区在线观看国产日韩| 精品视频网站| 亚洲3区在线| 久久蜜桃av| 另类欧美日韩国产在线| 亚洲自拍另类| 亚洲伦乱视频| 国产精品久久久久久久久免费高清 | 美女视频网站久久| 在线看片日韩| 免费毛片在线不卡| 麻豆91精品91久久久的内涵| 亚洲精品激情| 欧美日韩在线二区| 电影91久久久| 欧美日韩精品一区二区三区视频| 日韩午夜精品| 一本大道色婷婷在线| 国产乱子精品一区二区在线观看| 国产精品毛片| 久久久久久久久久久9不雅视频| 久久亚洲道色| 日本久久二区| 黄色精品网站| 久久蜜桃av| 日本免费一区二区三区四区| 久久一区精品| 国产免费av国片精品草莓男男| 免费黄色成人| 国产精品字幕| 国产精品蜜芽在线观看| 国产九九精品| 欧美一级网站| 日本久久二区| 日韩一区二区三免费高清在线观看| 亚洲在线网站| 免费成人网www| 蜜桃av.网站在线观看| 欧美经典一区| 日韩欧美中文字幕一区二区三区| 老牛国产精品一区的观看方式| 99精品视频在线观看免费播放| 高潮一区二区| 麻豆久久一区| 国产毛片精品| 国产日韩中文在线中文字幕 | 亚洲日本免费电影| 亚洲欧美日韩国产一区二区| 婷婷色综合网| 在线国产一区二区| 最新亚洲一区| 国产精品毛片| 日韩制服丝袜av| 视频在线观看国产精品| 香蕉精品999视频一区二区| 中文久久精品| 国产亚洲激情| 伊人久久亚洲影院| 国产一区导航| 一区二区亚洲视频| 视频一区中文字幕精品| 中文字幕一区二区三区四区久久| 日本大胆欧美人术艺术动态| 亚洲视频二区| 日韩国产精品久久久久久亚洲| 日本成人中文字幕| 国产亚洲人成a在线v网站| 国产精品天堂蜜av在线播放| 国产精品毛片视频| 精品美女久久| 欧美精品资源| 精品一区三区| 狠狠久久婷婷| 日韩有吗在线观看| 欧美一级久久| 美女性感视频久久| 欧美久久天堂| 欧美成人高清| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩激情精品| 精品国产黄a∨片高清在线| 中文字幕在线视频久| 欧美亚洲国产激情| 一级成人国产| 久久亚州av| 日韩欧美一区二区三区免费观看| 91精品一区二区三区综合| 一区二区视频欧美| 日韩欧美激情电影| 精品视频一二| 国产在线成人| 亚洲专区视频| 麻豆久久久久久| 久久久久久久久久久9不雅视频| 美女国产一区| 国产精品115| 91精品国产成人观看| 蜜臀va亚洲va欧美va天堂 | 美女久久99| 欧美13videosex性极品| 久久aⅴ国产紧身牛仔裤| 亚洲精品极品| 精品中国亚洲| 午夜久久久久| 欧美一区影院| 日韩中文视频| 日韩av中文在线观看| 国产精品二区不卡| 国产农村妇女精品一二区| 国产精品嫩草影院在线看| 亚洲午夜天堂| 亚洲精选91| 日韩欧美另类一区二区| 日韩精品一二三区| 久久成人高清| 日韩亚洲在线| 美女精品视频在线| av不卡在线看| 精品视频在线你懂得| 国产一区导航| 老司机免费视频一区二区三区| 国产高清久久| 国产精品巨作av| 精品1区2区3区4区| 国产精品一国产精品| 91精品一区国产高清在线gif | 久久国产高清|