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使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 Python
python爱心表白 每天都是浪漫七夕!
Aug 18 Python
对python 命令的-u参数详解
Dec 03 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
Python 多线程共享变量的实现示例
Apr 17 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 Python
python tqdm实现进度条的示例代码
Nov 10 Python
如何用python批量调整视频声音
Dec 22 Python
python中scipy.stats产生随机数实例讲解
Feb 19 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脚本的10个技巧(1)
2006/10/09 PHP
php session 预定义数组
2009/03/16 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
浅谈python对象数据的读写权限
2016/09/12 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
实例讲解Python3中abs()函数
2019/02/19 Python
np.random.seed() 的使用详解
2020/01/14 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
NULL是什么,它是怎么定义的
2015/05/09 面试题
自我鉴定的范文
2013/10/03 职场文书
自动化系在校本科生求职信
2013/10/23 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
《观舞记》教学反思
2014/04/16 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
Golang日志包的使用
2022/04/20 Golang