how overwrite Response class in django rest framework ( DRF )?

后端 未结 5 2176
日久生厌
日久生厌 2020-12-16 16:04

I want to overwrite Response class of django rest framework so that response back responsive dictionary contain three parameter message, stat

5条回答
  •  执笔经年
    2020-12-16 16:08

    Did you try to write custom Response middleware:

    class ResponseCustomMiddleware(MiddlewareMixin):
        def __init__(self, *args, **kwargs):
            super(ResponseCustomMiddleware, self).__init__(*args, **kwargs)
    
        def process_template_response(self, request, response):
    
            if not response.is_rendered and isinstance(response, Response):
                if isinstance(response.data, dict):
                    message = response.data.get('message', 'Some error occurred')
                    if 'data' not in response.data:
                        response.data = {'data': response.data}
                    response.data.setdefault('message', message)
                    # you can add you logic for checking in status code is 2** or 4**.
                    data_status = 'unknown'
                    if response.status_code // 100 == 2:
                        data_status = 'success'
                    elif response.status_code // 100 == 4:
                        data_status = 'failure'
                    response.data.setdefault('data_status', data_status)
            return response
    

    Add middleware in settings:

    MIDDLEWARE = [
        # you all middleware here,
        'common.middleware.ResponseCustomMiddleware',
    ]
    

    So you can return Response like this:

    data = {'var1': 1, 'var2': 2}
    return Response({'data': data, 'message': 'This is my message'}, status=status.HTTP_201_CREATED)
    

    Response will be like:

    {
      "data": [
        {
            "var1": 1,
            "var2": 2
        }
      ],
      "message": "This is my message",
      "data_status": "success"
    }
    

提交回复
热议问题