from rest_framework.renderers import JSONRenderer class BaseResponse(object): """ 封装的返回信息类 """ def __init__(self): self.code = 200 self.data = None self.msg = None @property def dict(self): return self.__dict__ class FitJSONRenderer(JSONRenderer): """ 自行封装的渲染器 """ def render(self, data, accepted_media_type=None, renderer_context=None): """ 如果使用这个render, 普通的response将会被包装成: {"code":200,"data":"X","msg":"X"} 这样的结果 使用方法: - 全局 REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ('utils.yg_response.FitJSONRenderer', ), } - 局部 class UserCountView(APIView): renderer_classes = [FitJSONRenderer] :param data: {"msg":"X"} :param accepted_media_type: :param renderer_context: :return: {"code":200,"data":"X","msg":"X"} """ response_body = BaseResponse() response = renderer_context.get("response") response_body.code = response.status_code if response_body.code >= 400: # drf异常 response_body.data = data if isinstance(data, dict): data = data[list(data.keys())[0]] if isinstance(data, list): data = data[0] if not isinstance(data, str): data = '请求错误' response_body.msg = data elif data and 'error' in data and data['error']:# 自传异常,key为error response_body.code = data.get("code",400) response_body.msg = data.get("error", "") else: response_body.data = data renderer_context.get("response").status_code = 200 # 统一成200响应,用code区分 return super(FitJSONRenderer, self).render(response_body.dict, accepted_media_type, renderer_context)