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之引用和类属性的初步理解
May 15 Python
通过C++学习Python
Jan 20 Python
浅谈Python数据类型之间的转换
Jun 08 Python
python简单实例训练(21~30)
Nov 15 Python
python3+PyQt5实现柱状图
Apr 24 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
基于python实现复制文件并重命名
Sep 16 Python
python 利用panda 实现列联表(交叉表)
Feb 06 Python
Numpy ndarray 多维数组对象的使用
Feb 10 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
JS防止用户多次提交的简单代码
2013/08/01 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
Python中的取模运算方法
2018/11/10 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
医大实习自我鉴定
2013/12/07 职场文书
办理居住证介绍信
2014/01/15 职场文书
小学庆六一活动方案
2014/02/28 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
学生请假条
2014/04/11 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
2015年三万活动总结
2015/03/25 职场文书
python实现剪贴板的操作
2021/07/01 Python
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js