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分割文件的常用方法
Nov 01 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
从Python的源码来解析Python下的freeblock
May 11 Python
Python中max函数用法实例分析
Jul 17 Python
利用python将pdf输出为txt的实例讲解
Apr 23 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
python实现简单的单变量线性回归方法
Nov 08 Python
python实现连续图文识别
Dec 18 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
python 窃取摄像头照片的实现示例
Jan 08 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安装问题
2006/10/09 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
tagName的使用,留一笔
2006/06/26 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
Vue性能优化的方法
2020/07/30 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
Python备份Mysql脚本
2008/08/11 Python
Python最基本的输入输出详解
2015/04/25 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
python安装教程
2018/02/28 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
python对象与json相互转换的方法
2019/05/07 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
中专毕业生自荐信
2013/11/16 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
2014年维稳工作总结
2014/11/18 职场文书
学生会辞职信
2015/03/02 职场文书