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实现支持目录FTP上传下载文件的方法
Jun 03 Python
python抽象基类用法实例分析
Jun 04 Python
浅析Python基础-流程控制
Mar 18 Python
Python处理JSON数据并生成条形图
Aug 05 Python
python如何读写json数据
Mar 21 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
Python中turtle库的使用实例
Sep 09 Python
python爬虫-模拟微博登录功能
Sep 12 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
Python批量将csv文件转化成xml文件的实例
May 10 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中将网页导出为Word文档的代码
2012/05/25 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
介绍Python中的文档测试模块
2015/04/28 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
酒店保洁主管岗位职责
2013/11/28 职场文书
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
小学生打架检讨书
2014/01/26 职场文书
农村婚礼主持词
2014/03/13 职场文书
实习评语大全
2014/04/26 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
门面租赁合同范文
2019/08/06 职场文书