drf 异常处理
异常处理
20.1 异常示例
视图
class ExceptionView(APIView):
def get(self, request):
a = 1/0
return Response({"message": "ok"})
路由
from django.urls import path
from . import views
urlpatterns = [
path('exc/',views.ExceptionView.as_view())
]
访问结果
返回的是一个页面,而不是json数据,前端是无法处理的,如果要返回json数据,那么就要进行try,但是每次在可能出现的异常的地方都要try有点麻烦,所以我们要自定义异常。
20.2 自定义异常处理类
opt/exceptions.py
from rest_framework.views import exception_handler
from rest_framework.response import Response
def my_exception_handler(exc, context):
"""
自定义异常函数
:exc 本次发生的异常对象
:context 本次发生异常时的上下文环境信息,为字典类型
"""
response = exception_handler(exc, context)
if response is None: # 如果为None说明drf自己无法处理
if isinstance(exc, ZeroDivisionError):
response = Response({"detail": "0不能作为除数或分母"})
return response
配置全局异常处理类
REST_FRAMEWORK = {
......
# 自定义异常
'EXCEPTION_HANDLER': 'opt.exceptions.my_exception_handler',
}
访问效果
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"detail": "0不能作为除数或分母"
}