Django实现统一包装接口返回值数据格式
前言
【Django实现统一包装接口返回值数据格式】最近实在太忙了,开始了一个新的项目,为了快速形成产品,我选择了Django来实现后端,然后又拿起了之前我封装了项目脚手架「DjangoStarter」。
由于前段时间我写了不少.NetCore的后端代码,对CRUD的接口开发又有了一些新的理解,所以肯定也要把DjangoStarter改造一番,改得更加顺手~
题外话:话说我在前端终于真正用上react,不得不说 ts + react 真好用,「前端带师」的安利可真不错啊(妙啊正题 准确来讲是搭配
DjangoRestFramework
来实现的,核心代码分为两部分,一个是错误处理包装,一个是响应包装renderer
。无论请求是否报错,都会被我们自定义的
renderer
包装。代码 开始上代码吧~
首先在项目里添加一个新的Python包,位置根据情况自行安排,我在
DjangoStarter
模板中的位置是utils/response
,接下来的两个文件都会放在这个目录中第一个是错误处理的
exception.py
文件代码from typing import Dictfrom 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 statusdef 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 JSONRendererclass 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
推荐阅读
- 二进制数的运算原理与门电路实现
- 明道云如何实现银行内部评级管理
- 云原生时代如何用 Prometheus 实现性能压测可观测-Metrics 篇
- 设计并实现一个简单自动化部署工具
- 分库分表实现方式Client和Proxy,性能和维护性该怎么选()
- python实现简易猜数小游戏
- 【UWP】实现一个波浪进度条
- 数据结构|【数据结构初阶】大堆与小堆的实现(向上向下调整)TopK问题
- 数据结构|【初阶数据结构】完全二叉树实现堆排序
- 数据结构|【数据结构初阶】(堆的接口实现和堆排序)