Django 解决开发自定义抛出异常的问题
作者:Amberdreams 发布时间:2023-03-05 12:43:55
在开发过程中,针对用户输入的不合法信息,我们应该在后端进行数据验证,并抛出相关的异常传递到前端来提示用户。
可是如何进行自定义抛出异常信息呢?通常处理方法有三种,我将依次介绍这三种方法。
第一种方法:
这种方法最为简单,只需要创建一个字典对象,通过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)
工作流程
访问触发异常
自动抛出自定制异常
自定义异常捕获函数捕获到异常并将用户友好的数据返回给前端
来源:https://blog.csdn.net/Amberdreams/article/details/85223029


猜你喜欢
- 1。mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,其实就是把主数
- 解决办法: 1.新建一个同名的数据库(数据文件与原来的要一致) 2.再停掉sql server(注意不要分离数据库) 3.用原数据库的数据文
- Javascript脚本获取form和input内容的方法随着js的发展,许多的网页数据处理完全可以由js脚本解决,而不需要发送到服务器这里
- 方法一.Image { max-width:600px;height:
- 写在前面这两种方式的配置基本相同,都是配一下node地址,Eslint执行文件的地址,Eslint的配置文件(就是.eslintrc)等,而
- 要点说明在绘制散点图的时候,通常使用变量作为输入数据的载体。其实,也可以使用字符串作为输入数据的存储载体。下面代码的data = {“a”:
- 前言:Ruby 与 Python 之间的差异在很大程度上可通过for循环看出本质。Python 拥有for语句。对象告诉for如何进行协作,
- 国庆假期快到了,想查查还有几天几小时到假期,这对程序员
- 这里列出了javascript 中的document.execCommand() 的各种参数说明:2D-Position 允许通过
- 本文实例讲述了Python开发的实用计算器。分享给大家供大家参考,具体如下:实现功能:图形界面PyQt,输入框,+,—,*,/ ;乘方 ,开
- Python是支持可视化编程,即编写gui程序,你可以用它来编写自己喜欢的桌面程序。使用wxPython来做界面非常的简单,只是不能像C#一
- 前言说到运算符重载相信大家都不陌生,运算符重载的作用是让用户定义的对象使用中缀运算符(如 + 和 |)或一元运算符(如 - 和 ~)。说得宽
- 最近在看java编程思想,看到类型信息这一章,讲到了类的信息以及反射的概念。顺便温故一下php的反射东西。手册是这样说的:"PHP
- 想想你在一家公司里做表格,现在有一个下面这样的excel表摆在你面前,这是一个员工每个月工资的表,现在假设,你要做的事情,是填充好后面几个月
- Dubbo提供动态调整超时时间的服务治理能力,可以在无需重启应用的情况下,动态调整服务超时时间。Dubbo可以通过XML配置,注解配置,动态
- 前言用命令行方式调用用例是我们最常用的方式,这方面确实比java的TestNG框架要好用许多,至少不用写xml文件,为了提供定制化运行用例的
- 对于mysql驱动问题折腾了一下午,现共享出解决方案1:手动安装驱动完全是场噩梦,推荐大家采用自动安装2:自动安装下载自动安装包,下载地址:
- linux系统使用python获取cpu信息脚本分享#!/usr/bin/env Pythonfrom __future__ import
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 二维码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形。二维码被称为快速响应码,可能看起来很简