{
"code": 200,
"msg": "ok",
"data": { some data }
}
{
"code": 404,
"msg": "http not found",
"data": null
}
我说一下我之前的实现,这种实现我认为很怪,而且并不能完美封装一些 500 错误,想请教一下有没有什么可以优雅的方式。
首先我使用一个 dataclasses.dataclass 进行定义返回数据结构(code,msg,data)
from dataclasses import dataclass
from typing import Any
@dataclass
class Result:
code: int
msg: str
data: Any
后面我需要打各种补丁
from dataclasses import asdict
from django.http import JsonResponse
from rest_framework import views
class SomeApiView(views.APIView):
def get(, request, *args, **kwargs) -> JsonResponse:
# do something
return JsonResponse(asdict(Result(200, 'ok', null)))
from dataclasses import asdict
from django.http import JsonResponse
from rest_framework import status, mixins
class MyRetrieveModelMixin(mixins.RetrieveModelMixin):
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return JsonResponse(asdict(Result(200, 'ok', serializer.data)))
# 配置
REST_FRAMEWORK = {
# ...
# 异常处理(统一封装为 code msg data 格式)
'EXCEPTION_HANDLER': 'utils.result_handler.custom_exception_handler',
# ...
}
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is not None:
# logger
# 进行一些处理 处理成 Result(code, msg, data)
# 这里对很多处理,尤其 serializer 中的处理 特别烦!
# 比如手机号唯一约束,前端就想要 code:400 msg:"该手机号已被使用"
return JsonResponse(...)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.