重写drf的ValidationError, 改变抛出异常的状态码
项目中修改密码
修改密码功能,前端将老密码和新密码发到后端,后端校验,返回信息,我反序列化时这里使用了obj.is_valid(raise_exception=True)会将钩子中 raise ValidationError({...})抛出的异常返回,但是状态码是 400, 前端想要200,所以要重写 异常类,将默认的状态码改成 200 ok
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.authentication import SessionAuthentication
from seahub.api2.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework import status
from seahub.api2.throttling import UserRateThrottle
from rest_framework.exceptions import APIException# ValidationError 中默认的状态码是 400
# APIException中默认的是 500状态码# 使raise抛出的异常状态码 为 200 ok
class ValidationErrorFailed(APIException):status_code = status.HTTP_200_OKdef __init__(self, detail):self.detail = detailclass PasswordSerializer(serializers.Serializer):def __init__(self, **kwargs):# 在序列化类中使用requestself.request = kwargs.get('context').get('request')super(PasswordSerializer, self).__init__(**kwargs)def validate(self, attrs):logging.info(attrs)old_password = self.request.data.get('old_password')new_password1 = self.request.data.get('new_password1')new_password2 = self.request.data.get('new_password2')user = self.request.userlogging.info(user)logging.info(old_password)if not user.check_password(old_password):logging.info(user.check_password(old_password))# 如果是 raise ValidationError({...}) 那么抛出的异常是400raise ValidationErrorFailed({"status": [False],"msg":["Your old password was entered incorrectly. Please enter it again."]})if new_password1 != new_password2:raise ValidationErrorFailed({"status": [False],"msg": ["The two password fields didn't match."]})return attrsdef save(self):user = self.request.useruser.set_password(self.request.data.get('new_password1'))user.save()if config.FORCE_PASSWORD_CHANGE:UserOptions.objects.unset_force_passwd_change(self.request.user.username)UserOptions.objects.set_latest_passwd_change_time(user.username)class PwdChange(APIView):authentication_classes = (TokenAuthentication, SessionAuthentication)permission_classes = (IsAuthenticated,)throttle_classes = (UserRateThrottle,)def post(self,request,*args, **kwargs):request_data = request.dataauth_ser = PasswordSerializer(data=request_data, context={'request':request})logging.info(auth_ser)if auth_ser.is_valid(raise_exception=True):auth_ser.save()return Response({"status": [True],"msg": ["The password modify successfully."]})return Response({'status':False})
改之前:
改之后:
重写drf的ValidationError, 改变抛出异常的状态码相关推荐
- php 企业微信指令回调借款_php处理微信支付回调改变订单支付状态的代码
本篇文章给大家带来的内容是关于php服务端APP微信支付回调验证签名改变订单支付状态,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.<?php //处理微信支付回调 $time ...
- Why I am here--细谈如何Hadoop重写分块函数,改变分块规则
2015-03-26 11:29 论文需要用到这一部分技术,但苦于一直没有深入的学习,所以还请您赐教,谢谢!!!qq:945856510,为了交流方便. 阿笨猫 2015-03-26 11:40 ha ...
- 使用jquery判断及改变checkbox选中状态
使用jquery判断及改变checkbox选中状态 https://jingyan.baidu.com/article/fea4511a00f66af7ba912560.html
- 6 统一建模语言(UML)图中,( )用于对时间如何改变对象的状态以及引起对象从一个状态向另一个状态转换的事件进行建模。( )是此种图的一种特殊情况,对于系统的功能建模特别重要,并强调对象间的控制
标签: 软考初级程序员易错题,计算机基础, 面向对象基础,统一建模语言 (UML) 6 统一建模语言(UML)图中,( )用于对时间如何改变对象的状态以及引起对象从一个状态向另一个状态转换的事件进行建 ...
- Layui改变数据的状态
开发工具与关键技术: VisualStudio 2015 mvc 作者:杨泽平 撰写时间:2019.6.26 Layui改变数据状态,其实是给每条数据通过js方法往HTML里嵌入两种不同的文字或者两个 ...
- 【Servlet】什么是Servlet;常见状态码;Servlet API;Cookie和Session
Servlet 文章目录 Servlet 1. Servlet是什么 2. 第一个Servlet程序 2.1 创建项目 2.2 引入依赖 2.3 创建目录 2.4 编写代码 2.5 打包程序 2.6 ...
- ASP.NET的SEO:HTTP报头状态码---内容重定向
本系列目录 我们经常说"404错误",你知道他指的是什么意思么? 404其实是Http报头所包含的一个"状态码",表明该Http请求失败.那么除此之外,还有哪些 ...
- HTTP状态码和编程
一 HTTP状态码 状态码 消息 描述 100 Continue 只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求 101 Switching Protocols 服务 ...
- 302状态码_HTTP协议详解(基础概念 方法 状态码 首部 连接 Cookie 新特性 安全)
一 .基础概念 URI URI 包含 URL 和 URN. 请求和响应报文 1. 请求报文 2. 响应报文 二.HTTP 方法 客户端发送的 请求报文 第一行为请求行,包含了方法字段. GET 获取资 ...
最新文章
- 一位美国前辈工程师的十大职业发展忠告
- MySQL数据库az排序_RDS Mysql Single-AZ和Multi-AZ性能差异
- PyCairo 后端
- FastClick使用之trigger触发click失效
- Takeown--夺取文件or文件夹所有权
- Fast Matrix Operations
- P2P原理及UDP穿透简单说明
- 前端学习(3051):vue+element今日头条管理-表格组件基本使用
- java jwindow 键盘_各位老哥求救,JWINDOW无法接收到键盘监听
- android支付宝支付开发过程
- profibus dp协议_PROFIBUS-DP总线的应用及布线安装要点
- java转换 HTML字符实体,java特殊字符转义字符串
- centos7配置时间同步服务器
- 【毕业设计】2021年计算机专业-12套精品项目源码免费下载
- 基于SPSS的交叉表分析
- DM6437 GPIO模拟I2C
- 骆昊python100天 github_GitHub - MingZhao2019/Python-100-Days: Python - 100天从新手到大师
- Druid以及监控界面的使用
- 云服务器系统安装设置方法,云服务器系统怎么安装
- 南宁发展重点向南 五象湖标志性建筑“五象塔”落成