在开发过程中,针对用户输入的不合法信息,我们应该在后端进行数据验证,并抛出相关的异常传递到前端来提示用户。

在setting.py中添加相关配置

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.xd_exceptions.custom_exception_handler',
}

在项目主目录创建utils文件夹,在文件夹中创建文件xd_exceptions,编写自定义错误抛出代码custom_exception_handler

custom_exception_handler

# -*- coding: utf-8 -*-
"""
@author: 多点部落
@contact: wouldmissyou@163.com
@time: 2021/3/24 10:12 
@file: xd_exceptions.py
@desc: 
"""
from rest_framework.views import exception_handler


def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)

    # Now add the HTTP status code to the response.
    if response is not None:
        response.data['status_code'] = response.status_code
        # print(response.data)
        response.data['message'] =response.data['detail']  #增加message这个key
        # response.data['message'] ='方法不对'  #增加message这个key

    return response

因为django自带的http404只返回detail提示,这全然不是我们想要的结果,我们想要的结果如下图

image-20210324102354907

要返回状态码和提示信息。

自定义状态码和提示信息

在utils文件夹中新建errors.py文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: 多点部落
@contact: wouldmissyou@163.com
@time: 2021/3/24 10:13 
@file: errors.py
@desc: 
"""
from rest_framework import status
from rest_framework.exceptions import APIException

class XdError(APIException):
    pass


class ParamError(XdError):
    status_code = 400


class Unauthorized(XdError):
    status_code = 401


class PermissionDenied(XdError):
    status_code = 403


class ObjectNotFound(XdError):
    status_code = 404


class ServerError(XdError):
    status_code = 500


class ErrorCode:
    UNAUTHORIZED = 10000  # 未登录
    PERMISSION_DENIED = 10001  # 无权限
    PARAM_ERROR = 40000  # 参数验证错误
    DATA_NOT_FOUND = 40001  # 未找到数据
    DATA_NOT_VALID = 40002  # 数据错误
    REPEAT_POST = 40003  # 重复提交
    EEEE = 40003  # 新型错误

现在可以在视图中验证一下

from utils import errors

class UserDetailView(APIView):
    """
    获取,更新或删除一个指定ID的user。
    """
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]

    def get_object(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            raise errors.ObjectNotFound("未找到该用户", errors.ErrorCode.DATA_NOT_FOUND)

    def get(self, request, user_id):
        user = self.get_object(user_id)
        serializer = UserSerializer(user)
        return Response({"code": 0, 'data': serializer.data, 'message': '获取成功'})

    def delete(self, request, user_id):
        user = self.get_object(user_id)
        user.is_del = True
        user.save()
        return Response({"code": 0, 'message': '删除成功'})

放我们输入错误的参错,导致在数据库中没有找到我们需要的数据,就会抛出以下异常

image-20210324102612779

本文作者:博主:
文章标题:djangorestframework中自定义抛出异常信息
本文地址:https://www.wouldmissyou.com/archives/77/     
版权说明:若无注明,本文皆为“多点部落”原创,转载请保留文章出处。
最后修改:2021 年 03 月 24 日 10 : 27 AM
如果觉得我的文章对你有用,请随意赞赏