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 相关文章推荐
scrapy爬虫实例分享
Dec 28 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
简单了解python变量的作用域
Jul 30 Python
python__name__原理及用法详解
Nov 02 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
python连接mongodb集群方法详解
Feb 13 Python
Python实现AI自动抠图实例解析
Mar 05 Python
python怎么提高计算速度
Jun 11 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
python进行参数传递的方法
2020/05/12 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
四年的个人工作自我评价
2013/12/10 职场文书
物流司机岗位职责
2013/12/28 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
心理健康课教学反思
2014/02/13 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript