Django实现统一包装接口返回值数据格式
前言
最近实在太忙了,开始了一个新的项目,为了快速形成产品,我选择了Django来实现后端,然后又拿起了之前我封装了项目脚手架「DjangoStarter」。
由于前段时间我写了不少.NetCore的后端代码,对CRUD的接口开发又有了一些新的理解,所以肯定也要把DjangoStarter改造一番,改得更加顺手~
题外话:话说我在前端终于真正用上react,不得不说 ts + react 真好用,「前端带师」的安利可真不错啊(妙啊 正题
准确来讲是搭配 DjangoRestFramework 来实现的,核心代码分为两部分,一个是错误处理包装,一个是响应包装renderer 。
无论请求是否报错,都会被我们自定义的 renderer 包装。代码
开始上代码吧~
首先在项目里添加一个新的Python包,位置根据情况自行安排,我在 DjangoStarter 模板中的位置是utils/response ,接下来的两个文件都会放在这个目录中
第一个是错误处理的 exception.py 文件代码from typing import Dict from rest_framework.exceptions import ValidationError from rest_framework.views import exception_handler from rest_framework.views import Response from rest_framework.utils.serializer_helpers import ReturnDict from rest_framework import status def custom_handler(err: ValidationError, context: dict): # 先调用REST framework默认的异常处理方法获得标准错误响应对象 response: Response = exception_handler(err, context) if response is None: return Response({ "message": f"服务器错误:{err}" }, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True) else: res = {"message": response.reason_phrase} res.update(response.data) return Response(res, status=response.status_code, exception=True)
然后是自定义 renderer.py 代码:from rest_framework.renderers import JSONRenderer class CustomRenderer(JSONRenderer): # 重构render方法 def render(self, data, accepted_media_type=None, renderer_context=None): if renderer_context: # 响应的信息,成功和错误的都是这个 # 成功和异常响应的信息,异常信息在前面自定义异常处理中已经处理为{"message": "error"}这种格式 # 如果返回的data为字典 if isinstance(data, dict): # 响应信息中有message和code这两个key,则获取响应信息中的message和code,并且将原本data中的这两个key删除,放在自定义响应信息里 # 响应信息中没有则将msg内容改为请求成功 code改为请求的状态码 msg = data.pop("message", "请求成功") code = data.pop("code", renderer_context["response"].status_code) # 如果不是字典则将msg内容改为请求成功 code改为响应的状态码 else: msg = "请求成功" code = renderer_context["response"].status_code # 自定义返回的格式 ret = { "message": 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)
关键的地方都注释了,很容易看懂
包装出来每个接口的返回值就都是这个样子 { "message": "msg", "code": 200, "data": { "data1": "123" } } 配置
为了让上面的代码发挥作用,还得配置一下RestFramework
编辑 settings.py 文件,在REST_FRAMEWORK 节点添加这两个配置,注意路径要和前面两个文件的路径一致。这里我是以DjangoStarter 项目为例。REST_FRAMEWORK = { # 全局配置异常模块 "EXCEPTION_HANDLER": "utils.response.exception.custom_handler", # 修改默认返回JSON的renderer的类 "DEFAULT_RENDERER_CLASSES": ("utils.response.renderer.CustomRenderer",), }
现在就完成了~ 就是这么简单。
(比AspNetCore包装返回值简单……)
完整代码可以在GitHub上查看:https://github.com/Deali-Axy/DjangoStarter 参考资料Django rest framework自定义返回数据格式:https://blog.csdn.net/qq_41475058/article/details/112676908
本文来自https://www.cnblogs.com/deali/p/16094959.html
俄罗斯00后天才情侣加入华为近日,华为宣布年仅22岁的瓦莱里娅里亚布奇科娃(ValeriaRyabchikova),已正式加入华为俄罗斯下诺夫哥罗德研究所,任职高级工程师,从事智能计算应用加速技术方面的研究。
正则表达式函数封装案例直接拿来用什么是正则表达式我们平时打游戏需要先注册账号,注册不是随意的,而是按照一定的规则,否则就无法注册成功。那么这个规则的判断就是通过正则表达式来判断的。其他语言也会使用正则表达式,我们
老罗终于可以坐飞机了老罗被执行人信息清零。意味着老罗可以坐飞机,可以买点东西了。老罗一生很传奇,一个50岁的中年男人依然在继续着传奇奋斗史。高二退学,2000年给现在当红主播俞敏洪写求职信,两次试讲失
工信部共4款降噪耳机获工信部A级认证,漫步者两款在列据国家工业信息安全发展研究中心官网显示,经测评,漫步者TWSNB2漫步者NeoBudsProOPPOEncoFree2iOnePlusBudsPro共4款产品在测评中综合表现优异,
春节期间快递停吗?国家邮政局回应谣言又来了?近日,春节期间快递停运的消息又在网络上传播开来。经记者核实,该传言为假消息,今年春节期间,EMS顺丰京东物流等主要寄递企业均表示春节不打烊。根据各快递企业发布的服务公告
物流春节不打烊升级,行业下半场服务战打响离春节只有半个月时间了,近年来,年货已从零散的线下采购向线上网购转移,各家电商平台相继推出年货节活动,在全民消费水平提升进行时,多家物流服务商也再次宣布春节不打烊。如今物流春节不打
哪一个版本的电脑系统最好用?经常使用电脑的小伙伴们,你们现在使用的是哪一个版本的电脑系统?记得以前最早的用DOS,后来使用Windows95,接着使用Windows98,然后使用WindowsXPWindow
被称作胶水语言的Python,到底该怎么学不管是前几年还是现在,Python在编程界一直处于C位,确实Python一直被称为胶水语言肯定是有它的优势不论从自身的可读性维护性移植性及跨平台等优势来说,受到了众多开发者的青睐,
蔚来正式发布NIOOS3。0。0系统近日,蔚来正式发布了NIOOS3。0。0系统,并向用户开启推送。新版本带来全新的界面交互设计,新增组队出行潮汐全民K歌等多个全新功能,并优化了NOMINIOPilot等功能体验。为
沉默已久的戴尔,原来在闷声发大财如今的戴尔,早已不仅仅是一家电脑公司。文丨华商韬略南来很少有人记得,仅仅在八年前,这家公司曾经被逼到了怎样山穷水尽的绝境。五年等待2018年12月28日,阔别美股市场五年之久的戴尔
对于今日头条,你认为哪些方面需要改进?答千提问不如一改进!1规范正规化提问,杜绝负能量无聊低级趣味挑衅性问题。2设置可以选择关闭私信功能(因为经常有负能量骚扰)3凡是粗话脏话识别系统要及时删除。4肃清攻击祖国的反动言论