第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

首頁 慕課教程 RESTful 規(guī)范教程 RESTful 規(guī)范教程 13 異常處理與自動(dòng)生成文檔

異常處理與自動(dòng)生成文檔

“圣人千慮,必有一失”,程序也是如此。當(dāng) RESTful Web API 服務(wù)器發(fā)生異常,該如何處理呢?構(gòu)建好的 RESTful Web API,客戶端開發(fā)人員又該如何調(diào)用呢?這一節(jié),我們就為大家一一道來。

1.異常處理

當(dāng)遇到異常時(shí),Django Rest framework 會(huì)自動(dòng)捕獲,并按默認(rèn)邏輯處理。我們也可以通過自定義異常處理函數(shù)來實(shí)現(xiàn)對(duì)異常的處理。

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # 先調(diào)用REST framework默認(rèn)的異常處理方法獲得標(biāo)準(zhǔn)錯(cuò)誤響應(yīng)對(duì)象
    response = exception_handler(exc, context)

    # 在此處補(bǔ)充自定義的異常處理
    if response is not None:
        response.data['status_code'] = response.status_code

    return response

在配置文件中聲明自定義的異常處理

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

如果未聲明,會(huì)采用默認(rèn)的方式,如下

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

例如:

補(bǔ)充上處理關(guān)于數(shù)據(jù)庫的異常

from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from django.db import DatabaseError

def exception_handler(exc, context):
    response = drf_exception_handler(exc, context)

    if response is None:
        view = context['view']
        if isinstance(exc, DatabaseError):
            print('[%s]: %s' % (view, exc))
            response = Response({'detail': '服務(wù)器內(nèi)部錯(cuò)誤'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

    return response

2.REST framework 提供的異常類

  • APIException 所有異常的父類;

  • ParseError 解析錯(cuò)誤;

  • AuthenticationFailed 認(rèn)證失??;

  • NotAuthenticated 尚未認(rèn)證;

  • PermissionDenied 權(quán)限決絕;

  • NotFound 未找到;

  • MethodNotAllowed 請(qǐng)求方式不支持;

  • NotAcceptable 要獲取的數(shù)據(jù)格式不支持;

  • Throttled 超過限流次數(shù);

  • ValidationError 校驗(yàn)失敗。

3.自動(dòng)生成接口文檔

在前后端分離的項(xiàng)目中,在完成接口的開發(fā)之后,后端開發(fā)人員需要為前端人員編寫接口文檔,介紹接口調(diào)用方法和需要傳遞的參數(shù)。在 Django Rest framework 編寫接口后,可以自動(dòng)生成接口文檔,這無疑減輕了不少工作量。

接口文檔以網(wǎng)頁的方式呈現(xiàn),在生產(chǎn)接口文檔前,需要做如下操作:

3.1 安裝依賴

Django Rest framework 自動(dòng)生成接口文檔,需要coreapi庫的支持,在終端輸入如下命令:

pip install coreapi

3.2 在設(shè)置文件中進(jìn)行配置

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'
}

3.3 配置接口文檔訪路由地址

在總路由中添加接口文檔路徑。

文檔路由對(duì)應(yīng)的視圖配置為rest_framework.documentation.include_docs_urls,

參數(shù)title為接口文檔網(wǎng)站的標(biāo)題。

from rest_framework.documentation import include_docs_urls

urlpatterns = [
    ...
    path('docs/', include_docs_urls(title='接口文檔'))
]

4. 文檔描述說明的定義位置

  1. 單一方法的視圖,可直接使用類視圖的文檔字符串,如:
class StudentView(generics.ListAPIView):
    """
    返回所有學(xué)生信息.
    """
  1. 包含多個(gè)方法的視圖,在類視圖的文檔字符串中,分開方法定義,如:
class StudentListCreateView(generics.ListCreateAPIView):
    """
    get:
    返回所有學(xué)生信息.

    post:
    新建學(xué)生信息.
    """
  1. 對(duì)于視圖集 ViewSet,仍在類視圖的文檔字符串中分開定義,但是應(yīng)使用操作動(dòng)作名稱來區(qū)分,如:
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    """
    list:
    返回學(xué)生列表數(shù)據(jù)

    retrieve:
    返回學(xué)生詳情數(shù)據(jù)

    latest:
    返回最新的學(xué)生數(shù)據(jù)
    """

5. 訪問接口文檔網(wǎng)頁

注意:

  1. 視圖集 ViewSet 中的 retrieve 方法,在接口文檔中被稱作 read;

  2. 參數(shù)的 Description 需要在模型類或序列化器類的字段中以 help_text 選項(xiàng)定義,如:

class StudentsModel(models.Model):
    ...
    s_name = models.CharField(max_length=8, verbose_name='學(xué)生姓名', help_text='學(xué)生姓名')
    ...

6.小結(jié)

本小節(jié)為大家介紹了 API 實(shí)現(xiàn)過程中異常處理和 API 文檔的生成。熟練運(yùn)用異常處理技巧,可以很大程度上避免程序出錯(cuò),保證穩(wěn)定運(yùn)行。API 文檔的生成功能,可以快速生成 API 使用手冊(cè),而無需另外書寫,這讓廣大程序員擺脫了寫文檔的煩惱。