最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django REST 異常處理詳解

 更新時(shí)間:2020年07月15日 09:12:24   作者:袁慎建@ThoughtWorks  
這篇文章主要介紹了Django REST 異常處理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

異常

異常處理…允許錯(cuò)誤處理在程序結(jié)構(gòu)的中心或者高層級(jí)的地方被清晰有條理的組織起來。

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框架的視圖處理了各種異常,并正確地返回了錯(cuò)誤響應(yīng)。

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

被處理的異常有:

Rest框架內(nèi)部拋出的APIException的子類。

Django的Http404異常。

Django的PermissionDenied異常

針對(duì)每種情況,REST框架將返回一個(gè)包含了正確的狀態(tài)碼和content-type的響應(yīng)。響應(yīng)體包含了任何關(guān)于錯(cuò)誤本身的額外細(xì)節(jié)。

大部分的錯(cuò)誤響應(yīng)將在響應(yīng)體中包含了一個(gè)detail的鍵。

例如下面請(qǐng)求:

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

Accept: application/json

你還可能接收到一個(gè)錯(cuò)誤響應(yīng),表明對(duì)該資源DELETE方法不允許的。

HTTP/1.1 405 Method Not Allowed
Content-Type: application/json
Content-Length: 42

{"detail": "Method 'DELETE' not allowed."}

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

任何校驗(yàn)錯(cuò)誤將類似下面的形式:

HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 94

{"amount": ["A valid integer is required."], "description": ["This field may not be blank."]}

自定義異常處理

你可以實(shí)現(xiàn)你的自定義異常處理??梢酝ㄟ^創(chuàng)建一個(gè)異常處理函數(shù)將API視圖中拋出的異常轉(zhuǎn)換成響應(yīng)對(duì)象。這樣一來,你就可以控制你的API使用的錯(cuò)誤響應(yīng)格式。

這個(gè)異常處理函數(shù)必須傳入兩個(gè)參數(shù),第一個(gè)是要處理的異常,第二個(gè)是一個(gè)包含了任何額外上下文信息(例如當(dāng)前被處理的視圖)的字典。該異常處理函數(shù)要么返回一個(gè)Response對(duì)象,要么在異常無法處理的時(shí)候返回None。如果返回了None,異常將會(huì)被重新拋出,最后Django會(huì)返回一個(gè)標(biāo)準(zhǔn)的HTTP 500 ‘服務(wù)器錯(cuò)誤'的響應(yīng)。

例如,你可能希望保證所有的錯(cuò)誤響應(yīng)體中都包含了HTTP狀態(tài)碼,像這樣:

HTTP/1.1 405 Method Not Allowed
Content-Type: application/json
Content-Length: 62

{"status_code": 405, "detail": "Method 'DELETE' not allowed."}

為了更改響應(yīng)的格式,你可以編寫如下的自定義異常處理函數(shù):

from rest_framework.views import exception_handler

def 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

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

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

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

如果沒有指定,'EXCEPTION_HANDLER‘默認(rèn)使用的是REST框架提供的標(biāo)準(zhǔn)的異常處理器:

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

注意一點(diǎn),異常處理器僅僅在響應(yīng)是由拋出的異常產(chǎn)生時(shí)被調(diào)用。如果由視圖直接返回的響應(yīng),它將不會(huì)被調(diào)用,例如HTTP_400_BAD_REQUEST響應(yīng)是在序列化校驗(yàn)失敗時(shí)由generic視圖返回的,此時(shí)異常處理器就不會(huì)被調(diào)用。

API 引用

APIException

Signature: APIException()

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

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

例如,如果你的API依賴第三方服務(wù),這個(gè)服務(wù)有時(shí)候可能會(huì)不可用,你或許可以考慮為”503 Service Unavailable”HTTP響應(yīng)碼實(shí)現(xiàn)一個(gè)異常類,你可以這么做:

from rest_framework.exceptions import APIException

class ServiceUnavailable(APIException):
 status_code = 503
 default_detail = 'Service temporarily unavailable, try again later.'

ParseError

Signature: ParseError(detail=None)

在訪問request.data的時(shí)候,如果請(qǐng)求包含了非法的數(shù)據(jù),就會(huì)拋出該錯(cuò)誤。

默認(rèn),該異常返回”400 Bad Request”狀態(tài)碼。

AuthenticationFailed

Signature: AuthenticationFailed(detail=None)

當(dāng)請(qǐng)求包含了錯(cuò)誤的認(rèn)證信息的時(shí)候拋出。

Raised when an incoming request includes incorrect authentication.

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

NotAuthenticated

Signature: NotAuthenticated(detail=None)

當(dāng)未認(rèn)證的請(qǐng)求權(quán)限驗(yàn)證失敗時(shí)拋出。

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

PermissionDenied

Signature: PermissionDenied(detail=None)

當(dāng)一個(gè)經(jīng)認(rèn)證的請(qǐng)求在權(quán)限校驗(yàn)失敗時(shí)拋出。

默認(rèn)返回403 Forbidden

NotFound

Signature: NotFound(detail=None)

當(dāng)給定的URL不存在時(shí)拋出。該異常等效于標(biāo)準(zhǔn)的DjangoHttp404異常。

默認(rèn)返回404 Not Found.

MethodNotAllowed

Signature: MethodNotAllowed(method, detail=None)

在視圖中沒有與請(qǐng)求匹配的處理方法時(shí)拋出。

默認(rèn)返回405 Method Not Allowed

NotAcceptable

Signature: NotAcceptable(detail=None)

當(dāng)請(qǐng)求的接受頭不滿足任何可用的渲染器時(shí)拋出。

默認(rèn)返回406 Not Acceptable

UnsupportedMediaType

Signature: UnsupportedMediaType(media_type, detail=None)

當(dāng)訪問request.data時(shí),沒有解析器來處理請(qǐng)求數(shù)據(jù)的內(nèi)容類型時(shí)拋出。

默認(rèn)返回415 Unsupported Media Type

Throttled

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

當(dāng)請(qǐng)求超過最大限制時(shí)拋出。

默認(rèn)返回429 Too Many Requests

ValidationError

Signature: ValidationError(detail)

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

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

detail參數(shù)是強(qiáng)制的,非可選。

detail參數(shù)可以是錯(cuò)誤細(xì)節(jié)的列表或者字典,也可以是一個(gè)內(nèi)嵌的數(shù)據(jù)結(jié)構(gòu)。

約定中,你應(yīng)該導(dǎo)入序列化器模塊并使用完整描述的ValidationError格式,這是為了跟Django的內(nèi)置檢驗(yàn)錯(cuò)誤區(qū)分開來。例如.raise serializers.ValidationError('This field must be an integer value.')

ValidationError類應(yīng)該通過驗(yàn)證器類為序列化器和字段校驗(yàn)使用。它也會(huì)在調(diào)用serializer.is_valid方法,并指定了raise_exception時(shí)被拋出。

serializer.is_valid(raise_exception=True)

在generic視圖中使用raise_exception=True標(biāo)記,意味著你可以在你的API中全局復(fù)寫校驗(yàn)錯(cuò)誤響應(yīng)的格式。如果你要這么做,建議你使用一個(gè)自定義的異常,上文有描述。

默認(rèn)情況下,該異常返回400 Bad Request

更多閱讀官方原文鏈接

以上這篇Django REST 異常處理詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyQt5+Caffe+Opencv搭建人臉識(shí)別登錄界面

    PyQt5+Caffe+Opencv搭建人臉識(shí)別登錄界面

    這篇文章主要為大家詳細(xì)介紹了PyQt5+Caffe+Opencv搭建人臉識(shí)別登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • python中復(fù)數(shù)的共軛復(fù)數(shù)知識(shí)點(diǎn)總結(jié)

    python中復(fù)數(shù)的共軛復(fù)數(shù)知識(shí)點(diǎn)總結(jié)

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python中復(fù)數(shù)的共軛復(fù)數(shù)知識(shí)點(diǎn)總結(jié),有需要的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • 詳解Python self 參數(shù)

    詳解Python self 參數(shù)

    這篇文章主要介紹了Python self 參數(shù)詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 使用Python集合顯著優(yōu)化算法性能的實(shí)戰(zhàn)案例

    使用Python集合顯著優(yōu)化算法性能的實(shí)戰(zhàn)案例

    掌握?Python?中的?set?數(shù)據(jù)結(jié)構(gòu),是算法和數(shù)據(jù)結(jié)構(gòu)的基本功,今天我們從一個(gè)實(shí)戰(zhàn)案例出發(fā),探討如何利用Python集合顯著優(yōu)化算法性能,感興趣的同學(xué)跟著小編一起來探討吧
    2023-06-06
  • 詳解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法

    詳解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法

    這篇文章主要介紹了詳解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python list中append()與extend()用法分享

    python list中append()與extend()用法分享

    列表是以類的形式實(shí)現(xiàn)的?!皠?chuàng)建”列表實(shí)際上是將一個(gè)類實(shí)例化。因此,列表有多種方法可以操作
    2013-03-03
  • Python算法之求n個(gè)節(jié)點(diǎn)不同二叉樹個(gè)數(shù)

    Python算法之求n個(gè)節(jié)點(diǎn)不同二叉樹個(gè)數(shù)

    本文先向大家分享了建立二叉樹的簡單代碼,其次介紹了Python計(jì)算n個(gè)節(jié)點(diǎn)不同二叉樹個(gè)數(shù)的問題及實(shí)現(xiàn)代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 分享介紹Python的9個(gè)實(shí)用技巧

    分享介紹Python的9個(gè)實(shí)用技巧

    本文將介紹15個(gè)簡潔的Python技巧,向著簡潔更高效,學(xué)習(xí)易懂出發(fā),具說只有經(jīng)驗(yàn)豐富程序員才知道的9種高級(jí)Python小技巧,喜歡的朋友快來看看吧
    2021-11-11
  • Python實(shí)現(xiàn)HTML轉(zhuǎn)Word的示例代碼

    Python實(shí)現(xiàn)HTML轉(zhuǎn)Word的示例代碼

    這篇文章主要為大家詳細(xì)介紹了使用Python實(shí)現(xiàn)HTML轉(zhuǎn)Word的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 用pycharm開發(fā)django項(xiàng)目示例代碼

    用pycharm開發(fā)django項(xiàng)目示例代碼

    這篇文章主要介紹了用pycharm開發(fā)django項(xiàng)目示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

科技| 镇原县| 扬州市| 塘沽区| 左贡县| 中西区| 宁阳县| 偃师市| 聊城市| 安宁市| 乌拉特中旗| 合作市| 米林县| 怀远县| 革吉县| 兴安盟| 漯河市| 商河县| 横山县| 桂东县| 日土县| 湾仔区| 瑞昌市| 兴安县| 溧水县| 屏东市| 枝江市| 沁水县| 习水县| 河津市| 金门县| 宜黄县| 南郑县| 普宁市| 嘉兴市| 昌图县| 罗田县| 阜平县| 普宁市| 章丘市| 巩留县|