Django rest framework之全域性異常、封裝Response物件及自動生成介面文件

一切隨心走_水瓶發表於2020-11-12

1、全域性異常

統一介面的返回方式,即便檢視函式執行出錯也能被捕獲

1.1、使用方式

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import exception_handler

# 定義一個函式
def custom_exception_handler(exc, context):
    # 先呼叫REST framework預設的異常處理方法獲得標準錯誤響應物件
    response = exception_handler(exc, context)

    # 在此處補充自定義的異常處理
    if response is None:
        response = Response({'code':999,'detail': '未知錯誤'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response

# 在setting中配置
REST_FRAMEWORK = {
	'EXCEPTION_HANDLER':'app01.utils.common_exception_handler'
}

1.2、案例

from rest_framework.views import exception_handler
from rest_framework.response import Response
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']
        print('[%s]: %s' % (view, exc))
        if isinstance(exc, DatabaseError):
            response = Response({'detail': '伺服器內部錯誤'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
        else:
            response = Response({'detail': '未知錯誤'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response
  
# 在setting.py中配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.ser.exception_handler'
}

1.3、REST framework定義的異常

  • APIException 所有異常的父類
  • ParseError 解析錯誤
  • AuthenticationFailed 認證失敗
  • NotAuthenticated 尚未認證
  • PermissionDenied 許可權決絕
  • NotFound 未找到
  • MethodNotAllowed 請求方式不支援
  • NotAcceptable 要獲取的資料格式不支援
  • Throttled 超過限流次數
  • ValidationError 校驗失敗

也就是說,很多的沒有在上面列出來的異常,就需要我們在自定義異常中自己處理了

2、封裝Response物件

1、以後都使用自己自定義封裝的response
class APIResponse(Response):
    def __init__(self, code=100, msg='成功', data=None, status=None, headers=None, content_type=None, **kwargs):
        dic = {'code': code, 'msg': msg}
        if data:
            dic['data'] = data

        dic.update(kwargs) # 這裡使用update
        super().__init__(data=dic, status=status,
                         template_name=None, headers=headers,
                         exception=False, content_type=content_type)

2、使用
	return APIResponse(code=100,msg='查詢成功',data=ser.data,count=200,next='http://xxx.com')

3、自動生成介面文件

1、藉助於第三方: coreapi,swagger
2、在路由中配置
    from rest_framework.documentation import include_docs_urls
    path('docs/', include_docs_urls(title='圖書管理系統api'))
    
3、在配置檔案中
	REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
	}
	
4、寫檢視類(需要加註釋)
    class BookListCreateView(ListCreateAPIView):
        """
        get:
        返回所有圖書資訊.
        asdfasfda

        post:
        新建圖書.
        """
        queryset = Student.objects.all()
        serializer_class = StudentSerializer
        
5、只需要在瀏覽器輸入,就可以看到自動生成的介面文件()
	http://127.0.0.1:8000/docs/

相關文章