当前位置: 首页 > backend >正文

Django+DRF 实战:从异常捕获到自定义错误信息

文章目录

    • 一、DRF 异常
      • 介绍
      • `ValidationError` 异常
    • 二、`ValidationError` 异常实战
      • 实战场景
      • 定义序列化器
      • 定义视图
      • 实战效果


一、DRF 异常

介绍

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

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

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

from rest_framework.exceptions import APIExceptionclass ServiceUnavailable(APIException):status_code = 503default_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从入门到实战》专栏!关注不迷路~

http://www.xdnf.cn/news/14866.html

相关文章:

  • 从入门到精通:数据库全攻略
  • Jenkins-Publish HTML reports插件
  • 技术与情感交织的一生 (九)
  • Python 的内置函数 reversed
  • WPS中配置MathType教程
  • 数学中微分与导数的理解和区别
  • Linux基本命令篇 —— uname命令
  • 本地部署Dify并结合ollama大语言模型工具搭建自己的AI知识库
  • 垂起固定翼无人机介绍
  • 二叉树题解——将有序数组转换为二叉搜索树【LeetCode】传统解法
  • Compose 高级用法详解——AI教你学Docker
  • 焊接机器人结构设计cad【16张】三维图+设计说明书+绛重
  • SQL 快速参考手册-SQL001
  • 思辨场域丨数字信号技术重塑农林牧渔:从“靠天吃饭”到“靠数吃饭”
  • 【V13.0 - 战略篇】从“完播率”到“价值网络”:训练能预测商业潜力的AI矩阵
  • Rust Web 全栈开发(二):构建 HTTP Server
  • 《导引系统原理》-西北工业大学-周军-“2️⃣导引头的角度稳定系统”
  • 计算机科学导论(10)什么是BIOS
  • 伞兵 钓鱼的肝
  • 好用的自带AI功能的国产IDE
  • Linux 自旋锁的实现
  • 基于SpringBoot+Vue的酒类仓储管理系统
  • Java 核心技术与框架实战十八问
  • 从0开始学习R语言--Day37--CMH检验
  • 如何将信息从 iPhone 同步到Mac(完整步骤和示意图)
  • Mac电脑 触摸板增强工具 BetterTouchTool
  • NumPy 安装使用教程
  • Qt的前端和后端过于耦合(0/7)
  • Apache POI 详解 - Java 操作 Excel/Word/PPT
  • 【网工|知识升华版|实验】5 网络质量探测