DRF统一返回格式

DRF中如何统一返回格式

目前在在给科室网站定义DRF的时候,遇到这样的一个问题,就是DRF的原生返回的式样是多样的,例如在访问成功的时候会返回这样的数据{“access”:fkasjfkljgkljgklsjgksjlksjfkljslfjs},但是在序列化器错误的时候,会返回类似这样的格式{‘username’: [ErrorDetail(string=‘该字段是必填项。’, code=‘required’)], ‘password’: [ErrorDetail(string=‘该字段是必填项。’, code=‘required’)]},但是另外的接口访问的时候禁止,会出现这样的形式{‘detail’: ErrorDetail(string=‘找不到指定凭据对应的有效用户’, code=‘no_active_account’)},为了可以让前端可以方便查看相关的信息,我需要将这样不同的返回统一为{‘msg’:xxx,‘code’:200,‘data’:xxx}的式样,其中涉及到两个关键的文件,一个是自定义错误处理,另外一个是关于返回前端的数据渲染,分别是以下的两个文件:
1、customException.py:

from rest_framework.views import exception_handler
from rest_framework.views import Response
from rest_framework import status
from zzer_website2 import settingsdef custom_handler(err,context: dict):# 先调用REST framework默认的异常处理方法获得标准错误响应对象response: Response = exception_handler(err, context)if response is None:# 在DEBUG模式下不处理系统异常,如果处理后错误页面将变成标准格式if settings.DEBUG:raise errres = {'msg': '服务器错误!','code':500,'data':err}return Response(res, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True) #只有500这个状态码else:msg = response.reason_phraseif "detail" in response.data:data = response.data["detail"]else:data=[]for k,v in response.data.items():if isinstance(v,list):data.append(k+v[0])res = {}res.update(response.data)res["msg"] = msgres["code"] = response.status_coderes['data']=datareturn Response(res, status=response.status_code, exception=True)

第二个:customrender.py,如下

from rest_framework.renderers import JSONRenderer# 导入控制返回的JSON格式的类
class CustomRenderer(JSONRenderer):def render(self, data, accepted_media_type=None, renderer_context=None):if renderer_context:# 判断实例的类型,返回的数据可能是列表也可能是字典if isinstance(data, dict):# 如果是字典的话应该是返回的数据,会包含 msg, code, status 等字段,必须抽离出来msg = data.pop('msg', 'success')code = renderer_context['response'].status_codeif data.get('data',None):data=data.pop('data')# 自定义返回数据格式ret = {'msg': msg,'code': code,'data': data,}# 返回 JSON 数据return super().render(ret, accepted_media_type, renderer_context)else:return super().render(data, accepted_media_type, renderer_context)

当然,在setting也需要配置好指定相关的DRF配置,如下:

REST_FRAMEWORK = {'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema','DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 15,'DEFAULT_AUTHENTICATION_CLASSES': [# 使用rest_framework_simplejwt验证身份'rest_framework_simplejwt.authentication.JWTAuthentication','rest_framework.authentication.SessionAuthentication','rest_framework.authentication.BasicAuthentication'],'DEFAULT_RENDERER_CLASSES': ['backend.utils.CustomRender.CustomRenderer','rest_framework.renderers.BrowsableAPIRenderer',],'EXCEPTION_HANDLER': 'backend.utils.CustomException.custom_handler',
}

这样的话,就可以统一后端返回的数据,前端的话,只需要都从response[‘data’]中取到相关信息就行显示就足够了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch微调终极指南2:提升模型的准确性

作为一名机器学习从业者,你可能经常会发现自己处于这样一种情况:你正在针对特定任务微调预先训练的模型,但已经达到了无法进一步提高模型准确性的地步。 在本文中,我们将探讨可用于提高模型准确性的各种技术和策略。 这些方法旨在…

Python武器库开发-flask篇之session与cookie(二十六)

flask篇之session与cookie(二十六) 在 Flask 中,可以使用 session 来在不同请求之间存储和传递数据。Session 在客户端和服务器端之间交换,但是数据存储在服务器端。 Session 与 Cookie 的区别 session 和 cookie 都可以用来在不同请求之间存储和传递…

Spring底层原理学习笔记--第十一讲--(aop之proxy增强-jdk及aop之proxy增强-cglib)

AOP实现之proxy 1.jdk动态代理实现及要点 2.cglib代理实现及要点 invoke与invokeSuper区别 jdk动态代理实现及要点 package com.lucifer.itheima.a12;import java.lang.reflect.Proxy;public class JdkProxyDemo {interface Foo{void foo();}//该类可以设置成final类型 //j…

Vue3-readonly(深只读) 与 shallowReadonly(浅只读)

Vue3-readonly(深只读) 与 shallowReadonly(浅只读) readonly(深只读):具有响应式对象中所有的属性,其所有值都是只读且不可修改的。shallowReadonly(浅只读):具有响应式对象的第一层属性值是只读且不可修改的&#x…

使用requests库进行网络爬虫:IP请求错误的解决方法

目录 引言 一、了解requests库 二、遇到的问题 三、解决方法 1、随机化IP地址 2、减少请求频率 3、使用User Agent模拟浏览器行为 4、使用Cookies 四、注意事项 五、使用代理池 六、总结 引言 在利用Python的requests库进行网络爬虫操作时,我们有时会遇…

系列七、JVM的内存结构【堆(Heap)】

一、概述 一个JVM实例只存在一个堆内存,堆内存的大小是可以手动调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三个部分,即…

给openlab搭建web网站

1.作业的要求 2.访问www.openlab.com网站 2.1先准备好相关的包和关闭防火墙等操作 mount /dev/sr0 /mnt/ //先挂载 yum install httpd -y //下载htppd systemctl stop firewalld //关闭防火墙 setenforce 02.2然后开始配置文件和仓库 这一步比较关键,之前改了接口…

【OpenCV实现图像:OpenCV进行OCR字符分割】

文章目录 概要基本概念读入图像图像二值化小结 概要 在处理OCR(Optical Character Recognition,光学字符识别)时,利用传统的图像处理方法进行字符切分仍然是一种有效的途径。即便当前计算机视觉领域主导的是卷积神经网络&#xf…

JavaScript垃圾回收机制解析

JavaScript是一种动态语言,拥有自动内存管理。这意味着开发人员不需要手动分配和释放内存。在JavaScript中,垃圾回收器会自动处理不再需要使用的内存,以便重新利用。 1. 标记清除算法 JavaScript使用标记清除算法作为主要的垃圾回收机制。该…

DAO和增删改查通用方法-BasicDao

文章目录 一、BasicDao是什么?二、BasicDao分析三、BasicDao实现(1)BasicDao(2)ActorDao(3)TestDao 四、总结 一、BasicDao是什么? BasicDao:基础的数据对象,可以完成通用…

asp.net智能考试系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 智能考试系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 系统运行视频 https://www.bilibili.com/video/BV1gz4y1A7Qp/ 二、功能介绍 本系统使用Microsoft Visual Studio 201…

掌握键盘快捷键,在没有鼠标的情况下,也还是可以做到游刃有余,甚至可以用数字键来代替鼠标

键盘和鼠标是与计算机交互的重要外围设备。有些人可能会争辩说,你只需要这些设备中的一个,但事实上,只使用其中一个设备的电脑可能非常困难。但是,如果你的鼠标或笔记本电脑的触控板突然停止工作,而你无法修复它或无法使用备用鼠标,该怎么办? 在这种情况下,你可以使用…

树莓派4b编译FFmpeg支持硬件编解码

ffmpeg h264_omx解码器充分发挥树莓派gpu性能 准备 树莓派4b ,64位系统 修改树莓派的启动设置文件(/boot/config.txt)进行如下的调整: gpu_mem=256 framebuffer_depth=16安装依赖 常规依赖: sudo apt update sudo apt upgrade sudo apt -y install autoconf automake …

循环优先级仲裁~位屏蔽仲裁算法

参考了FPGA奇哥(下列视频中UP主)的讲解。 应该可以对多路读写DDR3进行操作,仅仲裁,不涉及DMA和Uibuf等。 2023年11月所写,暂未进行测试,日后补上。 第二天已完成测试,功能可行。 深入FPGA底层…

一生一芯18——Chisel模板与Chisel工程构建

Chisel模板链接如下: 链接: https://pan.baidu.com/s/1DNDKpz5VnTxPgoZBBOd-Ww?pwdrevg 提取码: revg Chisel转Verilog模板如下: 链接: https://pan.baidu.com/s/1T9JQL5BccxqI4bscfU-JyA?pwd7rw2 提取码: 7rw2 以下使用sbt作为构建工具 Chisel项目构…

DeepMind发布新模型Mirasol3B:更高效处理音频、视频数据

Google DeepMind日前悄然宣布了其人工智能研究的重大进展,推出了一款名为“Mirasol3B”的新型自回归模型,旨在提升对长视频输入的理解能力。该新模型展示了一种颠覆性的多模态学习方法,以更综合和高效的方式处理音频、视频和文本数据。 Googl…

MATLAB 模糊设计器 构建 模糊系统

系列文章目录 文章目录 系列文章目录前言一、创建 FIS 结构二、定义输入变量三、定义输出变量四、定义成员函数五、定义规则库六、设计分析七、存储和修改设计八、导出 FIS总结 前言 本例演示如何使用 Fuzzy Logic Designer 应用程序交互式创建 1 型 Mamdani 模糊推理系统&…

在线文档频繁故障不稳定,其实可以自己搭一个Etherpad在线文档

正文共:1116 字 20 图,预估阅读时间:2 分钟 最近某头部云厂商多次出现故障,导致在线文档使用受限,虽说影响不大,但我们有必要考虑一下是否有备用方案。 在自己搭建在线文档方面,我们之前测试过部…

Flutter打包iOS过程中pod访问github失败

问题描述 执行Flutter打包iOS命令出现如下错误: # flutter build ios ...Error output from CocoaPods: ↳Cloning into /var/folders/q8/sd0qtp6d69b30yt6gsh1jrg40000gq/T/d20231116-58127-8g2zje...fatal: unable to access https://github.com/ccgus/fmdb.git…

[Jenkins] 物理机 安装 Jenkins

这里介绍Linux CentOS系统直接Yum 安装 Jenkins,不同系统之间类似,操作命令差异,如:Ubuntu用apt; 0、安装 Jenkins Jenkins是一个基于Java语言开发的持续构建工具平台,主要用于持续、自动的构建/测试你的软…