Django 解决开发自定义抛出异常的问题


Posted in Python onMay 21, 2020

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

可是如何进行自定义抛出异常信息呢?通常处理方法有三种,我将依次介绍这三种方法。

第一种方法:

这种方法最为简单,只需要创建一个字典对象,通过render传到前端即可。

字典对象如下:

result = {'code':'', 'message':''}
render(request, 'xxx.html', result:result)

第二种方法:

需要继承Exception类, 代码如下:

# 利用继承自定义异常提示信息
class MyException(Exception):
  def __init__(self, code, error, data):
    self.code = code
    self.error = error
    self.data = data
try:
  if not 1 < 0:
    raise MyException(1001, '你的说法错误', '1不小于0')
except MyException as e:
  pass

第三种方法:

自定义一个继承 object 的类

class MyTest(object):
  def __init__(self):
    # 自定义状态码
    self.code = 1000
    self.error = ''
    self.data = ''
 
  @property
  def dict(self):
    return self.__dict__

在你需要自定义异常的时候,创建一个对象,并制定相关信息。

# 创建实例对象
one = MyTest()
one.code = 1001
one.error = '你错了'
one.data = '请再次检查'
 
print(one.dict)

综上所述是笔者常用来在后端检验数据并抛出相关异常信息的三种方法。

补充知识:Django rest framework 自定义异常处理

1.

在settings.py中需要添加的配置

1.install app中添加 'rest_framework',

2.在settings中的 添加这个配置

REST_FRAMEWORK = {
'EXCEPTION_HANDLER':'common.restframework.xd_exceptions.custom_exception_handler', #这是使用自定制异常处理
}

xd_exceptions.py这里是异常处理函数

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

自定义异常类 在主动抛出异常的时候就可以抛出一个下边类型的异常

my_errors.py

from rest_framework import status
from rest_framework.exceptions import APIException
from common.tools import xd_status

# class ParseError(APIException):
#   status_code = xd_status.HTTP_400_BAD_REQUEST
#   default_detail = '这是.default_detail========'
#   default_code = 'parse_error'
#

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 # 新型错误

在视图或函数中主动抛出异常,

class SupserUserDetailView(APIView):
  # authentication_classes = []
  permission_classes = [SupserPermisson,]

  def put(self,request,pk):
    if not request.user.is_superuser:
      if request.user.id != pk:
        raise ParamError('用户没有修改权限', ErrorCode.EEEE)  #这就是抛出自定义异常, 然后自己的异常捕获方式就能捕获这个异常
    user = User.objects.filter(id=pk)
    if not user:
      raise ParamError('被修改的用户不存在', ErrorCode.EEEE)
    data = handel_c_user(request.data)
    user_obj = Creat_newuser_serializers(data=data, instance=user.first())

    if user_obj.is_valid():
      user_obj.save()
      res={'status':"修改成功"}

      return JsonResponse(data=res, code=200, desc="success", status=status.HTTP_200_OK)
    res = {'status':user_obj.errors}

    return JsonResponse(data=res,code=200,desc="success",status=status.HTTP_200_OK)

工作流程

访问触发异常

自动抛出自定制异常

自定义异常捕获函数捕获到异常并将用户友好的数据返回给前端

以上这篇Django 解决开发自定义抛出异常的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python SQLite3数据库操作类分享
Jun 10 Python
详细解析Python中的变量的数据类型
May 13 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
Python_LDA实现方法详解
Oct 25 Python
python cs架构实现简单文件传输
Mar 20 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
Oct 21 Python
python3正则提取字符串里的中文实例
Jan 31 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
Python 堆叠柱状图绘制方法
Jul 29 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
python模板入门教程之flask Jinja
Apr 11 Python
Python logging模块写入中文出现乱码
May 21 #Python
django的403/404/500错误自定义页面的配置方式
May 21 #Python
python 3.8.3 安装配置图文教程
May 21 #Python
Python中的xlrd模块使用原理解析
May 21 #Python
python中sklearn的pipeline模块实例详解
May 21 #Python
Python使用re模块验证危险字符
May 21 #Python
Django 解决新建表删除后无法重新创建等问题
May 21 #Python
You might like
PHP Memcached应用实现代码
2010/02/08 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python复制文件操作实例详解
2015/11/10 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
python实现在线翻译
2020/06/18 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
C#笔试题集合
2013/06/21 面试题
linux比较文件内容的命令是什么
2013/03/04 面试题
怎样声明一个匿名的内部类
2016/06/01 面试题
实习医生自我评价
2013/09/22 职场文书
护理学毕业生求职信
2013/11/14 职场文书
初中生自我评价
2014/02/01 职场文书
医疗纠纷协议书
2014/04/16 职场文书
计算机专业自荐信
2014/05/24 职场文书
关于保护环境的标语
2014/06/09 职场文书
合伙经营协议书范本
2014/09/13 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
家长会感言
2015/08/01 职场文书