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

简介: 本文介绍了DRF(Django REST framework)中的异常处理机制,重点讲解了内置异常类ValidationError的使用场景与示例。同时通过用户注册功能的实战演示,展示了如何在序列化器中自定义参数校验规则,并在视图中捕获并返回结构化的错误信息,提升接口的健壮性与用户体验。

一、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 异常实战

实战场景

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

定义序列化器

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

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

image-20250704161215120.png

定义视图

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

image-20250704175020313.png

实战效果

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

image-20250704162315656.png

昵称校验失败:昵称太短

image-20250704162537164.png

密码校验失败:密码太长

image-20250704162951596.png

点击查看完整代码


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

相关文章
|
缓存 负载均衡 监控
每日一博 - 反向代理、API 网关、负载均衡
每日一博 - 反向代理、API 网关、负载均衡
469 0
|
数据库 C语言 Python
apt安装python-ldap报错处理及python LDAP各种模块之间的区别
apt安装python-ldap报错处理及python LDAP各种模块之间的区别
1084 0
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
ICLR 2025 | EDiT:一种基于 Local SGD 策略的大模型高效分布式训练方法
蚂蚁 AI Infra 团队在深度学习最核心之一的训练框架方向上持续投入与创新,实现了提升资源利用率、加速训练、提升训练稳定性等目标。我们提出的 EDiT 方法,即为其中一项工作。
|
6月前
|
弹性计算 人工智能 运维
阿里云算力服务的稳定性演进
本文介绍了弹性计算稳定性技术的基础能力研究,涵盖稳定性底座、实例异常检测、变更异常检测、风险规避和故障处置等方面。重点讲解了阿里云在ECS稳定性方面的进展,包括高可用架构设计、故障演练验证、持续运行阶段的稳定性保障以及相关工具和功能。此外,还探讨了Confidential AI的最佳实践,解决了大模型场景下的系统级安全风险,并介绍了机密计算产品的能力规划。最后,文章阐述了ACK容器服务的稳定性演进,包括高可用架构、托管节点池、供应链安全、事件体系、全链路检测、版本升级和成本管理等功能,确保用户能够获得高效稳定的容器服务体验。
|
7月前
|
C语言
【C语言】原码、反码、补码详解 -《码上有道 ! 》
在计算机科学中,整数的表示方式有多种,包括原码、反码和补码。这些表示方式主要用于解决整数的二进制表示和计算问题。本文将详细介绍这三种表示方法,并通过示例来说明它们的原理和应用,特别是它们在C语言中的应用。
766 5
|
编解码 C++ Windows
利用 LibWebP-NET 解码与编码 WebP 格式图片
原文:利用 LibWebP-NET 解码与编码 WebP 格式图片 WebP 格式是谷歌开发并发展的一种最新的网络图片格式,具有压缩率高、解码快、免版权、开源等优点。 大部分先进的网页浏览器、图片浏览器都支持该格式,Windows用户可以通过安装 WebP Codec for Windows 在系统中查阅WebP图片。
2869 0
|
JSON 物联网 5G
物联网平台的使用心得
物联网平台的使用心得
|
存储 JSON NoSQL
如何将DynamoDB的数据增量迁移到表格存储
AWS 的 Amazon DynamoDB 和阿里云的表格存储 TableStore 都是完全托管的NoSQL数据库服务,提供快速的、可预期的性能,并且可以实现无缝扩展。本篇文章介绍了如何使用 Lambda 将 DynamoDB 的数据增量迁移到表格存储中。
19078 0