一、DRF 异常

介绍

APIException 类是 DRF 异常的基类。通过继承APIException,DRF 提供了多种内置异常类。

  • ParseError:当请求解析失败时抛出。
  • AuthenticationFailed:认证失败时会出现这个异常。
  • NotAuthenticated:未认证的用户访问需要权限的资源时触发。
  • PermissionDenied:权限被拒绝时抛出该异常。
  • NotFound:请求的资源不存在时出现此异常。
  • MethodNotAllowed:使用不支持的 HTTP 方法时触发。
  • NotAcceptable:无法满足请求的 Accept 标头时抛出。
  • Throttled:请求被限流时会出现这个异常。
  • ValidationError:数据验证失败时触发。

通过继承 APIException 类,可以实现自定义(业务)异常。并根据业务需求在视图层返回。但这种方式比较麻烦,不太推荐。

from rest_framework.exceptions import APIException

class ServiceUnavailable(APIException):
status_code = 503
default_detail = '服务暂不可用,请稍后重试。'
default_code = 'service_unavailable'

ValidationError 异常

rest_framework.exceptions.ValidationError异常,一般用于序列化器,在数据验证失败时自动触发。

  • 语法:ValidationError(detail=None, code=None)
  • 属性status_code:默认为status.HTTP_400_BAD_REQUEST
  • 属性detail:默认为_('Invalid input.')。支持多种格式的错误信息,包括:
    • 字符串:会被转换为包含该字符串的列表。
    • 列表:代表多个错误信息。
    • 字典:指定字段级错误,键为字段名,值为对应字段的错误信息。

手动触发ValidationError异常示例

from rest_framework import serializers
raise serializers.ValidationError('This field must be an integer value.')
# 或
raise serializers.ValidationError({'name': 'Please enter a valid name.'})

二、ValidationError 异常实战

实战场景

对请求参数校验,并在不符合要求时返回自定义错误信息。例如:在用户注册的时候,对用户名、昵称和密码进行校验,校验失败时返回自定义的错误信息。

定义序列化器

定义用户注册序列化器,用户请求参数校验失败时,返回自定义错误信息

  • 校验用户名由字母数字组成、最小长度和最大长度
  • 校验昵称最小长度和最大长度
  • 校对密码最小长度和最大长度

定义视图

定义用户注册视图,调用序列化器的is_valid()方法,对用户请求参数校验

实战效果

用户名校验失败:用户名中含有下划线

昵称校验失败:昵称太短

密码校验失败:密码太长

点击查看完整代码


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

Django+DRF 实战:从异常捕获到自定义错误信息的更多相关文章

  1. Java异常封装(自定义错误信息和描述)

    一.checked异常和unchecked异常 checked异常: unchecked异常: 二.异常封装示例 2.1.添加一个枚举LuoErrorCode.java如下: 2.2.创建一个异常类B ...

  2. SpringBoot自定义错误信息,SpringBoot适配Ajax请求

    SpringBoot自定义错误信息,SpringBoot自定义异常处理类, SpringBoot异常结果处理适配页面及Ajax请求, SpringBoot适配Ajax请求 ============== ...

  3. 自定义错误信息并写入到Elmah

    在ap.net Web项目中一直使用Elmah进行日志记录, 但一直有一个问题困扰我很久,那就是我如何自己生成一个错误并记录到Elmah里去. 你知道有时你需要在项目中生成一个错误用于一些特殊的需求 ...

  4. 自定义 ocelot 中间件输出自定义错误信息

    自定义 ocelot 中间件输出自定义错误信息 Intro ocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候 ...

  5. C# 通过扩展WebBrowser捕获网络连接错误信息

    想捕获WebBrowser连接指定网站过程中发生的错误信息,包括网络无法连接.404找不到网页等等错误!经过网上的搜集,找到了以下解决方案,该解决方案不会在网站连接前发出多余的测试请求. 向Webbr ...

  6. jquery.validate使用 - 自定义错误信息

    自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...

  7. django项目部署服务器后无法发送邮箱 错误信息:Connection unexpectedly closed

    使用配置: python 3.7 + django 2.2.1    发送邮件模块 :  from django.core.mail import send_mail 服务器:Centos7 阿里云轻 ...

  8. jQuery.validate.js 自定义错误信息

    var validate = $("form").validate({....})validate.showError({"username":"us ...

  9. jQuery Validate自定义错误信息,自定义方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 解决 ASP.NET Core 自定义错误页面对 Middleware 异常无效的问题

    我们基于 Razor Class Library 实现了自定义错误页面的公用类库(详见之前的随笔),但是在实际使用时发现如果在 middleware 中发生了异常,则不能显示自定义错误页面,而是返回默 ...

随机推荐

  1. 【Linux】1.1 Linux课程介绍

    Linux课程介绍 1. 学习方向 linux运维工程师: 维护linux的服务器(一般大型企业) linux嵌入式工程师: linux做驱动开发,或者linux的嵌入式 linux下开发项目 2. ...

  2. unigui的错误delphi clientHeight:property clientheight does not exist【10】

    在unigui运行中发现这样的错误clientHeight:property clientheight does not exist. 这是啥原因.从老版本中复制过来的代码含dfm会出现这样的错误. ...

  3. 解密prompt系列52. 闲聊大模型还有什么值得探索的领域

    在DeepSeek-R1的开源狂欢之后,感觉不少朋友都陷入了技术舒适区,但其实当前的大模型技术只是跨进了应用阶段,可以探索的领域还有不少,所以这一章咱不聊论文了,偶尔不脚踏实地,单纯仰望天空,聊聊还有 ...

  4. DelayQueue 底层原理

    一.DelayQueue 底层原理 DelayQueue是一种本地延迟队列,比如希望我们的任务在5秒后执行,就可以使用DelayQueue实现.常见的使用场景有: 订单10分钟内未支付,就取消. 缓存 ...

  5. docker容器运行,交互式与守护式的区别

    一.使用交互式运行容器,容器运行后直接进入到容器内部,退出容器内部后,容器直接关闭

  6. Cocos Creator3.x小白常见问题笔记&官方视频教程合集收藏分享

    小白常见问题 为什么会有这篇笔记? 这篇笔记旨在答疑解惑官方文档或视频教程里忽略掉的细节.对于小白来说这些细节没人提醒或浪费很多时间,但在熟悉的人眼里这都是些什么问题,回都懒得回. (别问我怎么知道的 ...

  7. 【题解】洛谷P731[NOI1999] 生日蛋糕+数据加强版

    前言:阅读理解+剪枝+头脑风暴 Designed By FrankWkd 遵循GNU GPL2.0开源协议. 该代码可以通过T148457 生日蛋糕加强版 和 P1731 [NOI1999] 生日蛋糕 ...

  8. 自定义控件,重写 TextBox 实例

    项目中可能会遇到重写控件的情况,特此记录下: 1 <Window x:Class="WpfApp6.MainWindow" 2 xmlns="http://sche ...

  9. .NET AI从0开始入门 SemanticKernel 从基础到实践

    引言 本教程将带你全面了解SemanticKernel,一款强大的AI开发工具包.以下内容基于实际代码示例,帮助你快速掌握使用技巧. 资源链接: 教程代码仓库:https://github.com/A ...

  10. Python 3.14 t-string 要来了,它与 f-string 有何不同?

    Python 最近出了个大新闻:PEP-750 t-string 语法被正式采纳了! 这意味着 Python 将在今年 10 月发布的 3.14 版本中引入一种新的字符串前缀 t,称为模板字符串(Te ...