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基于PycURL自动处理cookie的方法
Jul 25 Python
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
Sublime开发python程序的示例代码
Jan 24 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
python中rb含义理解
Jun 18 Python
Android Q之气泡弹窗的实现示例
Jun 23 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
推荐文章系统(一)
2006/10/09 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
mouse_on_title.js
2006/08/25 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
Python实现把xml或xsl转换为html格式
2015/04/08 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
pandas参数设置的实用小技巧
2020/08/23 Python
详解Python yaml模块
2020/09/23 Python
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
缓刑人员的思想汇报
2014/01/11 职场文书
村官学习十八大感想
2014/01/15 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
收入证明申请书
2015/06/12 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python