Django重寫JSONRenderer類自定義返回的Json數據格式

重寫JSONRenderer類,類似於django的中間件,在response返回中viewset和試圖就會穿過render方法,在返回字段裏增加了code和msg參數

from rest_framework.renderers import JSONRenderer
class CustomJsonRender(JSONRenderer):
    """ 自定義返回數據 Json格式
    {
        "code": 0,
        "msg": "success",
        "data": { ... }
    }
    """

    def render(self, data, accepted_media_type=None, renderer_context=None):
        if renderer_context:
            response = renderer_context['response']
            code = 0 if int(response.status_code / 100) == 2 else response.status_code
            msg = 'success'
            if isinstance(data, dict):
                msg = data.pop('msg', msg)
                code = data.pop('code', code)
                data = data.pop('data', data)
            if code != 0 and data:
                msg = data.pop('detail', 'failed')
            response.status_code = 200
            res = {
                'code': code,
                'msg': msg,
                'data': data,
            }
            print(res)
            return super().render(res, accepted_media_type, renderer_context)
        else:
            return super().render(data, accepted_media_type, renderer_context)
  • 局部使用
class RouteView(ModelViewSet):
    queryset = models.UserInfo.objects.all()
    serializer_class = RouteSerializer
    renderer_classes = (CustomJsonRender,)
    search_fields = ['user']
  • 全局使用:在setting中配置
REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None,
    'UNAUTHENTICATED_TOKEN': None,
    "DEFAULT_THROTTLE_RATES": {
        'luffy_anon': '5/m',
        'luffy_user': '10/m'
    },
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend','rest_framework.filters.SearchFilter'),
    'DEFAULT_RENDERER_CLASSES': ('rest_framework.renderers.JSONRenderer',)
}

結束!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章