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实例一个类背后发生了什么
Feb 09 Python
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
解决uWSGI的编码问题详解
Mar 24 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
python3.6下Numpy库下载与安装图文教程
Apr 02 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
windows上安装python3教程以及环境变量配置详解
Jul 18 Python
Python如何存储数据到json文件
Mar 09 Python
python 写一个文件分发小程序
Dec 05 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
Python中super()函数简介及用法分享
2016/07/11 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Python中存取文件的4种不同操作
2018/07/02 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python 线程池用法简单示例
2019/10/02 Python
python 类之间的参数传递方式
2019/12/20 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
自我鉴定书范文
2013/10/02 职场文书
司机职责范本
2014/03/08 职场文书
大学生简历求职信
2014/06/24 职场文书
挂职学习心得体会
2014/09/09 职场文书
昆虫记读书笔记
2015/06/26 职场文书
少先队中队工作总结
2015/08/14 职场文书
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang