56 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
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.msg = data['detail'] if 'detail' in data else 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)
 |