20 全局异常处理

今日内容

0 全局异常处理

# 无论访问接口是否正常,都返回统一的格式
# drf内置有统一的异常处理(认证,失败抛异常),APIException及其子类的已经处理了,但是其他异常没有处理
# from rest_framework.views import exception_handler 就是drf的异常处理,不满足咱们的需求,无论什么异常,都统一处理,重写一个函数

models.py

from django.db import models

# Create your models here.
class User(models.Model):
   username=models.CharField(max_length=32)
   password=models.CharField(max_length=32)

views.py

class LoginView(APIView):
  def post(self,request):
       response={'code':101,'msg':'用户名或密码错误'}
       username=request.data.get("username")
       password=request.data.get("password")
       user=User.objects.filter(username=username,password=password)
       if user:
          response['code']=100
          response['msg']='登录成功'
      return Response(response)

urls.py

urlpatterns = [
  path('admin/', admin.site.urls),
  path('login/', LoginView.as_view()),
]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

为了统一异常格式,就用到了全局异常处理

common.py

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


def common_exception_handler(exc, context):
   # res如果是Response,表示是drf的异常,并且处理好了,如果是None,表示其他异常,并没有处理

   res = exception_handler(exc, context)  # 这个函数的执行,会处理drf的异常
   # 重点,要在这里记录日志(程序出错了,才会走到这)
   if res:
       return Response(data={'code': 888, 'msg': res.data.get('detail')})
   else:
       return Response(data={'code': 999, 'msg': '服务器内部错误,请联系系统管理员'})

settings.py

REST_FRAMEWORK = {
   # 这样配置,一旦出了异常,就会走这个函数,exception_handler内置的不满足咱们的的需求
   'EXCEPTION_HANDLER': 'app01.common.common_exception_handler',
}

 

posted @ 2022-02-08 16:39  甜甜de微笑  阅读(36)  评论(0编辑  收藏  举报