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使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
Python实现的计数排序算法示例
Nov 29 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
Django框架反向解析操作详解
Nov 28 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
python有序查找算法 二分法实例解析
Feb 18 Python
Django contrib auth authenticate函数源码解析
Nov 12 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 curl模拟浏览器抓取网站信息
2013/10/28 PHP
php数组去重复数据示例
2014/02/25 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
php封装实现钉钉机器人报警接口的示例代码
2020/08/08 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
javascript计时器详解
2015/02/28 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
用vue写一个日历
2020/11/02 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
心得体会怎么写
2013/12/30 职场文书
财务会计专业求职信
2014/06/09 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
大学生毕业个人总结
2015/02/15 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书