2021/1/23

django-Response请求封装

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2021/1/23 下午7:36
  3. # @Author : void bug
  4. # @FileName: Response.py
  5. # @Software: PyCharm
  6. from rest_framework.renderers import JSONRenderer
  7. class BaseResponse(object):
  8. """
  9. 封装的返回信息类
  10. """
  11. def __init__(self):
  12. self.code = 200
  13. self.data = None
  14. self.msg = None
  15. @property
  16. def dict(self):
  17. return self.__dict__
  18. class FitJSONRenderer(JSONRenderer):
  19. """
  20. 自行封装的渲染器
  21. """
  22. def render(self, data, accepted_media_type=None, renderer_context=None):
  23. """
  24. 如果使用这个render,
  25. 普通的response将会被包装成:
  26. {"code":200,"data":"X","msg":"X"}
  27. 这样的结果
  28. 使用方法:
  29. - 全局
  30. REST_FRAMEWORK = {
  31. 'DEFAULT_RENDERER_CLASSES': ('utils.response.FitJSONRenderer', ),
  32. }
  33. - 局部
  34. class UserCountView(APIView):
  35. renderer_classes = [FitJSONRenderer]
  36. :param data: {"msg":"X"}
  37. :param accepted_media_type:
  38. :param renderer_context:
  39. :return: {"code":200,"data":"X","msg":"X"}
  40. """
  41. response_body = BaseResponse()
  42. response = renderer_context.get("response")
  43. response_body.code = response.status_code
  44. if response_body.code >= 400: # 响应异常
  45. response_body.msg = data['detail'] if 'detail' in data else data
  46. else:
  47. response_body.data = data
  48. renderer_context.get("response").status_code = 200 # 统一成200响应,用code区分
  49. return super(FitJSONRenderer, self).render(response_body.dict, accepted_media_type, renderer_context)

2021/04/10

近日在一个比较好的项目里看到了一个比较不错的封装,代码如下

  1. """
  2. 封装 Response :主要对django 的 JsonResponse和 Response 进行重写
  3. """
  4. from django.core.serializers.json import DjangoJSONEncoder
  5. from django.http import JsonResponse
  6. from rest_framework.response import Response
  7. class OpDRFJSONEncoder(DjangoJSONEncoder):
  8. """
  9. 重写DjangoJSONEncoder
  10. (1)默认返回支持中文格式的json字符串
  11. """
  12. def __init__(self, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False,
  13. indent=None, separators=None, default=None):
  14. super().__init__(skipkeys=skipkeys, ensure_ascii=False, check_circular=check_circular,
  15. allow_nan=allow_nan, sort_keys=sort_keys, indent=indent, separators=separators,
  16. default=default)
  17. class SuccessResponse(Response):
  18. """
  19. 标准响应成功的返回, SuccessResponse(data)或者SuccessResponse(data=data)
  20. (1)默认错误码返回200, 不支持指定其他返回码
  21. """
  22. def __init__(self, data=None, msg='success', status=None, template_name=None, headers=None, exception=False,
  23. content_type=None):
  24. self.std_data = {
  25. "code": 200,
  26. "data": data,
  27. "msg": msg,
  28. "status": 'success'
  29. }
  30. super().__init__(self.std_data, status, template_name, headers, exception, content_type)
  31. def __str__(self):
  32. return str(self.std_data)
  33. class ErrorResponse(Response):
  34. """
  35. 标准响应错误的返回,ErrorResponse(msg='xxx')
  36. (1)默认错误码返回201, 也可以指定其他返回码:ErrorResponse(code=xxx)
  37. """
  38. def __init__(self, data=None, msg='error', code=201, status=None, template_name=None, headers=None,
  39. exception=False, content_type=None):
  40. self.std_data = {
  41. "code": code,
  42. "data": data,
  43. "msg": msg,
  44. "status": 'error'
  45. }
  46. super().__init__(self.std_data, status, template_name, headers, exception, content_type)
  47. def __str__(self):
  48. return str(self.std_data)
  49. class SuccessJsonResponse(JsonResponse):
  50. """
  51. 标准JsonResponse, SuccessJsonResponse(data)或者SuccessJsonResponse(data=data)
  52. (1)仅SuccessResponse无法使用时才能推荐使用SuccessJsonResponse
  53. """
  54. def __init__(self, data, msg='success', encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs):
  55. std_data = {
  56. "code": 200,
  57. "data": data,
  58. "msg": msg,
  59. "status": 'success'
  60. }
  61. super().__init__(std_data, encoder, safe, json_dumps_params, **kwargs)
  62. class ErrorJsonResponse(JsonResponse):
  63. """
  64. 标准JsonResponse, 仅ErrorResponse无法使用时才能使用ErrorJsonResponse
  65. (1)默认错误码返回201, 也可以指定其他返回码:ErrorJsonResponse(code=xxx)
  66. """
  67. def __init__(self, data, msg='error', code=201, encoder=OpDRFJSONEncoder, safe=True, json_dumps_params=None,
  68. **kwargs):
  69. std_data = {
  70. "code": code,
  71. "data": data,
  72. "msg": msg,
  73. "status": 'error'
  74. }
  75. super().__init__(std_data, encoder, safe, json_dumps_params, **kwargs)