2021/1/23
django-Response请求封装
# -*- coding: utf-8 -*-# @Time : 2021/1/23 下午7:36# @Author : void bug# @FileName: Response.py# @Software: PyCharmfrom rest_framework.renderers import JSONRendererclass BaseResponse(object):"""封装的返回信息类"""def __init__(self):self.code = 200self.data = Noneself.msg = None@propertydef 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.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_codeif response_body.code >= 400: # 响应异常response_body.msg = data['detail'] if 'detail' in data else dataelse:response_body.data = datarenderer_context.get("response").status_code = 200 # 统一成200响应,用code区分return super(FitJSONRenderer, self).render(response_body.dict, accepted_media_type, renderer_context)
2021/04/10
近日在一个比较好的项目里看到了一个比较不错的封装,代码如下
"""封装 Response :主要对django 的 JsonResponse和 Response 进行重写"""from django.core.serializers.json import DjangoJSONEncoderfrom django.http import JsonResponsefrom rest_framework.response import Responseclass OpDRFJSONEncoder(DjangoJSONEncoder):"""重写DjangoJSONEncoder(1)默认返回支持中文格式的json字符串"""def __init__(self, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False,indent=None, separators=None, default=None):super().__init__(skipkeys=skipkeys, ensure_ascii=False, check_circular=check_circular,allow_nan=allow_nan, sort_keys=sort_keys, indent=indent, separators=separators,default=default)class SuccessResponse(Response):"""标准响应成功的返回, SuccessResponse(data)或者SuccessResponse(data=data)(1)默认错误码返回200, 不支持指定其他返回码"""def __init__(self, data=None, msg='success', status=None, template_name=None, headers=None, exception=False,content_type=None):self.std_data = {"code": 200,"data": data,"msg": msg,"status": 'success'}super().__init__(self.std_data, status, template_name, headers, exception, content_type)def __str__(self):return str(self.std_data)class ErrorResponse(Response):"""标准响应错误的返回,ErrorResponse(msg='xxx')(1)默认错误码返回201, 也可以指定其他返回码:ErrorResponse(code=xxx)"""def __init__(self, data=None, msg='error', code=201, status=None, template_name=None, headers=None,exception=False, content_type=None):self.std_data = {"code": code,"data": data,"msg": msg,"status": 'error'}super().__init__(self.std_data, status, template_name, headers, exception, content_type)def __str__(self):return str(self.std_data)class SuccessJsonResponse(JsonResponse):"""标准JsonResponse, SuccessJsonResponse(data)或者SuccessJsonResponse(data=data)(1)仅SuccessResponse无法使用时才能推荐使用SuccessJsonResponse"""def __init__(self, data, msg='success', encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs):std_data = {"code": 200,"data": data,"msg": msg,"status": 'success'}super().__init__(std_data, encoder, safe, json_dumps_params, **kwargs)class ErrorJsonResponse(JsonResponse):"""标准JsonResponse, 仅ErrorResponse无法使用时才能使用ErrorJsonResponse(1)默认错误码返回201, 也可以指定其他返回码:ErrorJsonResponse(code=xxx)"""def __init__(self, data, msg='error', code=201, encoder=OpDRFJSONEncoder, safe=True, json_dumps_params=None,**kwargs):std_data = {"code": code,"data": data,"msg": msg,"status": 'error'}super().__init__(std_data, encoder, safe, json_dumps_params, **kwargs)
