69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
| from rest_framework.renderers import JSONRenderer
 | ||
| from rest_framework.views import exception_handler
 | ||
| from rest_framework.response import Response
 | ||
| import rest_framework.status as status
 | ||
| import logging
 | ||
| logger = logging.getLogger('log')
 | ||
| 
 | ||
| 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.response.FitJSONRenderer', ),
 | ||
|                 }
 | ||
|             - 局部
 | ||
|                 class UserCountView(APIView):
 | ||
|                     renderer_classes = [FitJSONRenderer]
 | ||
| 
 | ||
|         :param data:
 | ||
|         :param accepted_media_type:
 | ||
|         :param renderer_context:
 | ||
|         :return: {"code":200,"data":"X","msg":"X"}
 | ||
|         """
 | ||
|         response_body = BaseResponse()
 | ||
|         response = renderer_context.get("response")
 | ||
|         status_code = response.status_code # Http状态异常码
 | ||
|         if status_code >= 400:  # 如果http响应异常
 | ||
|             if isinstance(data, dict) \
 | ||
|                 and 'code' in data and 'msg' in data: # 如果自定义了异常码
 | ||
|                 response_body = data
 | ||
|             else:
 | ||
|                 response_body.data = data  # data里是详细异常信息
 | ||
|                 response_body.code = status_code
 | ||
|                 prefix = ""
 | ||
|                 if isinstance(data, dict):
 | ||
|                     prefix = list(data.keys())[0]
 | ||
|                     data = data[prefix]
 | ||
|                 if isinstance(data, list):
 | ||
|                     data = data[0]
 | ||
|                     
 | ||
|                 response_body.msg = prefix + str(data) # 取一部分放入msg,方便前端alert
 | ||
|         else:
 | ||
|             response_body.data = data
 | ||
|         renderer_context.get("response").status_code = 200  # 统一成200响应, 可用body里code区分业务异常
 | ||
|         return super(FitJSONRenderer, self).render(response_body.dict, accepted_media_type, renderer_context) |