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

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

Django REST 異常處理詳解

瀏覽:238日期:2024-09-26 10:25:10

異常

異常處理…允許錯誤處理在程序結構的中心或者高層級的地方被清晰有條理的組織起來。

Exceptions… allow error handling to be organized cleanly in a central or high-level place within the program structure.— Doug Hellmann, Python Exception Handling Techniques

Rest框架視圖中的異常處理

Exception handling in REST framework views

REST框架的視圖處理了各種異常,并正確地返回了錯誤響應。

REST framework’s views handle various exceptions, and deal with returning appropriate error responses.

被處理的異常有:

Rest框架內部拋出的APIException的子類。

Django的Http404異常。

Django的PermissionDenied異常

針對每種情況,REST框架將返回一個包含了正確的狀態碼和content-type的響應。響應體包含了任何關于錯誤本身的額外細節。

大部分的錯誤響應將在響應體中包含了一個detail的鍵。

例如下面請求:

DELETE http://api.example.com/foo/bar HTTP/1.1

Accept: application/json

你還可能接收到一個錯誤響應,表明對該資源DELETE方法不允許的。

HTTP/1.1 405 Method Not AllowedContent-Type: application/jsonContent-Length: 42{'detail': 'Method ’DELETE’ not allowed.'}

校驗錯誤的處理有些輕微的不同,它會把字段的名字作為鍵包含進來。如果校驗錯誤沒有被指定到一個特定的字段,那么它會使用non_field_errors作為鍵,或者是你在setting文件中設定的NON_FIELD_ERRORS_KEY任意字符串的值。

任何校驗錯誤將類似下面的形式:

HTTP/1.1 400 Bad RequestContent-Type: application/jsonContent-Length: 94{'amount': ['A valid integer is required.'], 'description': ['This field may not be blank.']}

自定義異常處理

你可以實現你的自定義異常處理。可以通過創建一個異常處理函數將API視圖中拋出的異常轉換成響應對象。這樣一來,你就可以控制你的API使用的錯誤響應格式。

這個異常處理函數必須傳入兩個參數,第一個是要處理的異常,第二個是一個包含了任何額外上下文信息(例如當前被處理的視圖)的字典。該異常處理函數要么返回一個Response對象,要么在異常無法處理的時候返回None。如果返回了None,異常將會被重新拋出,最后Django會返回一個標準的HTTP 500 ‘服務器錯誤’的響應。

例如,你可能希望保證所有的錯誤響應體中都包含了HTTP狀態碼,像這樣:

HTTP/1.1 405 Method Not AllowedContent-Type: application/jsonContent-Length: 62{'status_code': 405, 'detail': 'Method ’DELETE’ not allowed.'}

為了更改響應的格式,你可以編寫如下的自定義異常處理函數:

from 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. response = exception_handler(exc, context) # Now add the HTTP status code to the response. if response is not None: response.data[’status_code’] = response.status_code return response

參數context沒有被默認的異常處理器使用,但是如果你需要更多的信息,例如你想獲得當前被處理的視圖,它就能給你援助之手了。通過context[’view’]就可以獲取當前視圖。

同時你必須在你的settings中配置異常處理器,顯式地給EXCEPTION_HANDLER設置你期望的值,例如:

REST_FRAMEWORK = { ’EXCEPTION_HANDLER’: ’my_project.my_app.utils.custom_exception_handler’}

如果沒有指定,’EXCEPTION_HANDLER‘默認使用的是REST框架提供的標準的異常處理器:

REST_FRAMEWORK = { ’EXCEPTION_HANDLER’: ’rest_framework.views.exception_handler’}

注意一點,異常處理器僅僅在響應是由拋出的異常產生時被調用。如果由視圖直接返回的響應,它將不會被調用,例如HTTP_400_BAD_REQUEST響應是在序列化校驗失敗時由generic視圖返回的,此時異常處理器就不會被調用。

API 引用

APIException

Signature: APIException()

所有在APIView類中或者@api_view拋出的異常的基類。

為了提供自定義異常,自定義個類,繼承自APIException,并設置.status_code和.default_detail屬性。

例如,如果你的API依賴第三方服務,這個服務有時候可能會不可用,你或許可以考慮為”503 Service Unavailable”HTTP響應碼實現一個異常類,你可以這么做:

from rest_framework.exceptions import APIExceptionclass ServiceUnavailable(APIException): status_code = 503 default_detail = ’Service temporarily unavailable, try again later.’

ParseError

Signature: ParseError(detail=None)

在訪問request.data的時候,如果請求包含了非法的數據,就會拋出該錯誤。

默認,該異常返回”400 Bad Request”狀態碼。

AuthenticationFailed

Signature: AuthenticationFailed(detail=None)

當請求包含了錯誤的認證信息的時候拋出。

Raised when an incoming request includes incorrect authentication.

默認情況下,該異常返回401 Unauthenticated,但是也有可能返回403 Forbidden,這取決于使用的認證模式。詳細內容參考authentication documentation

NotAuthenticated

Signature: NotAuthenticated(detail=None)

當未認證的請求權限驗證失敗時拋出。

默認情況下,該異常返回401 Unauthenticated,但是也有可能返回403 Forbidden,這取決于使用的認證模式。詳細內容參考authentication documentation

PermissionDenied

Signature: PermissionDenied(detail=None)

當一個經認證的請求在權限校驗失敗時拋出。

默認返回403 Forbidden

NotFound

Signature: NotFound(detail=None)

當給定的URL不存在時拋出。該異常等效于標準的DjangoHttp404異常。

默認返回404 Not Found.

MethodNotAllowed

Signature: MethodNotAllowed(method, detail=None)

在視圖中沒有與請求匹配的處理方法時拋出。

默認返回405 Method Not Allowed

NotAcceptable

Signature: NotAcceptable(detail=None)

當請求的接受頭不滿足任何可用的渲染器時拋出。

默認返回406 Not Acceptable

UnsupportedMediaType

Signature: UnsupportedMediaType(media_type, detail=None)

當訪問request.data時,沒有解析器來處理請求數據的內容類型時拋出。

默認返回415 Unsupported Media Type

Throttled

Signature: Throttled(wait=None, detail=None)

當請求超過最大限制時拋出。

默認返回429 Too Many Requests

ValidationError

Signature: ValidationError(detail)

ValidationError跟其他的APIException類稍微有些不同:

The ValidationError exception is slightly different from the other APIException classes:

detail參數是強制的,非可選。

detail參數可以是錯誤細節的列表或者字典,也可以是一個內嵌的數據結構。

約定中,你應該導入序列化器模塊并使用完整描述的ValidationError格式,這是為了跟Django的內置檢驗錯誤區分開來。例如.raise serializers.ValidationError(’This field must be an integer value.’)

ValidationError類應該通過驗證器類為序列化器和字段校驗使用。它也會在調用serializer.is_valid方法,并指定了raise_exception時被拋出。

serializer.is_valid(raise_exception=True)

在generic視圖中使用raise_exception=True標記,意味著你可以在你的API中全局復寫校驗錯誤響應的格式。如果你要這么做,建議你使用一個自定義的異常,上文有描述。

默認情況下,該異常返回400 Bad Request

更多閱讀官方原文鏈接

以上這篇Django REST 異常處理詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品免费视频人成| 91嫩草亚洲精品| 久久精品国语| 亚洲成人精品| 99re国产精品| 91精品国产福利在线观看麻豆| av中文资源在线资源免费观看| 美日韩一区二区三区| 精品午夜av| 四虎4545www国产精品| 偷拍欧美精品| 日本成人手机在线| 日韩av免费大片| 亚洲欧美日韩国产| 国产精品伦一区二区| 久久青青视频| 国产婷婷精品| 欧美日韩一区二区三区四区在线观看| 麻豆久久一区| 狠狠干成人综合网| 日韩中文字幕麻豆| 久久99久久久精品欧美| 亚洲伦乱视频| 18国产精品| 久久精品国产亚洲夜色av网站| 一二三区精品| 国产综合色区在线观看| 日韩国产一区二| 国产在线观看91一区二区三区 | 香蕉久久99| 日韩精品三区四区| 激情欧美日韩一区| 日韩二区在线观看| 日本国产精品| 亚洲91在线| 欧美亚洲精品在线| 欧美亚洲tv| 亚洲免费播放| 免费一二一二在线视频| 日本精品在线播放| 欧美在线日韩| 亚洲免费影院| japanese国产精品| 国产一区二区色噜噜| 国产美女久久| 91精品国产自产精品男人的天堂| 亚洲综合日韩| 亚洲综合不卡| 久久中文字幕av| 国产精品不卡| 亚洲国产成人二区| 国产精品igao视频网网址不卡日韩| 模特精品在线| 精品一区欧美| 在线天堂中文资源最新版| 亚洲精品系列| 亚洲精品乱码日韩| 日本伊人久久| 91精品丝袜国产高跟在线| 日韩av一区二区在线影视| 97成人在线| 欧美日韩亚洲一区在线观看| 婷婷精品久久久久久久久久不卡| 91精品一区二区三区综合在线爱| 亚洲精品乱码久久久久久蜜桃麻豆| 99视频在线精品国自产拍免费观看| 久久蜜桃资源一区二区老牛| 麻豆精品新av中文字幕| 国产亚洲欧美日韩精品一区二区三区| 欧美日本不卡高清| 一区二区电影在线观看| 成人啊v在线| 美女一区网站| 亚洲无线一线二线三线区别av| 久久理论电影| 激情综合在线| 国产精品日本| 午夜亚洲福利在线老司机| 亚洲专区欧美专区| 99热精品在线| 最近国产精品视频| 亚洲精品在线a| 日韩国产在线观看| 视频在线观看一区| 日本久久一区| 国产美女久久| 日韩不卡一区| 免费久久久久久久久| 国产精品国产一区| 久久蜜桃av| 美腿丝袜在线亚洲一区| av成人国产| 久久99国产精品视频| 在线看片国产福利你懂的| 亚洲在线免费| 成人日韩在线| 久久精品凹凸全集| 国产视频亚洲| 久久国产欧美| 精品国产乱码久久久| 亚洲欧美网站在线观看| 日韩欧美一区二区三区在线视频| 一区二区高清| 国产亚洲精品v| 亚洲欧洲高清| 国产劲爆久久| 亚洲日本欧美| 日韩午夜免费| 亚洲最新无码中文字幕久久| 日韩成人精品一区二区三区| 9久re热视频在线精品| 四虎4545www国产精品| 不卡一二三区| 激情黄产视频在线免费观看| 国产精品1区| 国产色噜噜噜91在线精品| 视频在线观看国产精品| 在线视频精品| 五月综合激情| 黄色国产精品| 99香蕉国产精品偷在线观看| 香蕉人人精品| 欧美精品一卡| 韩国三级一区| 成人精品视频| 亚洲深夜视频| 亚洲爱爱视频| 亚洲一区二区三区四区五区午夜 | 日韩一二三区在线观看| 久久av在线| 亚洲精品精选| 日韩精品视频在线看| 日本午夜免费一区二区| 国产精品1区| 国产精品xx| 黄色成人91| 日韩av一级片| 免费精品国产的网站免费观看| 国产欧美一区二区精品久久久 | 美女网站久久| 亚洲久久在线| 亚洲影视一区二区三区| 国产探花一区| 老司机免费视频一区二区| 精品理论电影在线| 欧美国产小视频| 九九在线精品| 日韩三级一区| 精品久久影院| 蜜臀av免费一区二区三区| 丝袜a∨在线一区二区三区不卡| 欧美亚洲一级| 老牛影视一区二区三区| 国产精品一国产精品k频道56| 国产色99精品9i| 樱桃视频成人在线观看| 国产视频一区三区| 亚洲精品国产精品粉嫩| 麻豆免费精品视频| 99精品在线观看| 日韩av不卡在线观看| 在线观看精品| 国产欧美69| 国产婷婷精品| 深夜福利视频一区二区| 亚洲香蕉久久| 日本不卡免费高清视频在线| 亚洲精品福利电影| 亚洲日韩视频| 亚洲手机视频| 精品女同一区二区三区在线观看| 欧美日韩国产传媒| 欧美亚洲国产日韩| 欧美日韩国产精品一区二区亚洲| 国产亚洲字幕| 一区二区三区网站| 亚洲a一区二区三区| 国产探花在线精品一区二区| 亚洲精品1区2区| 色综合www| 欧美韩日一区| 欧美另类中文字幕| 热久久免费视频| 亚洲精品a级片| 成人日韩精品| 日韩在线精品| 三上悠亚国产精品一区二区三区 | 日韩精品一区二区三区中文在线 | 午夜性色一区二区三区免费视频| 日韩中文在线电影| 国产一区二区三区久久久久久久久| 免费观看在线综合| 久久国产毛片| 国产精品91一区二区三区| 国产精品资源| 国产精品22p| 日韩久久99| 久久激情五月激情| 国产日韩欧美一区二区三区在线观看| 鲁大师影院一区二区三区|