異常處理與自動(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. 文檔描述說明的定義位置
- 單一方法的視圖,可直接使用類視圖的文檔字符串,如:
class StudentView(generics.ListAPIView):
"""
返回所有學(xué)生信息.
"""
- 包含多個(gè)方法的視圖,在類視圖的文檔字符串中,分開方法定義,如:
class StudentListCreateView(generics.ListCreateAPIView):
"""
get:
返回所有學(xué)生信息.
post:
新建學(xué)生信息.
"""
- 對(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)頁
注意:
-
視圖集 ViewSet 中的 retrieve 方法,在接口文檔中被稱作 read;
-
參數(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è),而無需另外書寫,這讓廣大程序員擺脫了寫文檔的煩惱。