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通过线程实现定时器timer的方法
Mar 16 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
Python中对象的引用与复制代码示例
Dec 04 Python
Python对象属性自动更新操作示例
Jun 15 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
解决pyecharts在jupyter notebook中使用报错问题
Apr 23 Python
python import 上级目录的导入
Nov 03 Python
pandas统计重复值次数的方法实现
Feb 20 Python
Python数据分析之绘图和可视化详解
Jun 02 Python
Python合并多张图片成PDF
Jun 09 Python
Python合并pdf文件的工具
Jul 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
smarty缓存用法分析
2014/12/16 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
python3中zip()函数使用详解
2018/06/29 Python
python:动态路由的Flask程序代码
2019/11/22 Python
如何基于python操作excel并获取内容
2019/12/24 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
Python3开发环境搭建详细教程
2020/06/18 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
个人函授自我鉴定
2014/03/25 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
党员示范岗材料
2014/12/19 职场文书
python图像处理 PIL Image操作实例
2022/04/09 Python