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

后端 未结 5 2188
日久生厌
日久生厌 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:05

    To resolve this, best practice (that DRF has proposed) is to use 'renderer' classes. A renderer manipulates and returns structured response.

    Django uses renderers like Template Renderer and DRF benefits this feature and provides API Renderers.

    To do so, you could provide such this renderer in a package (e.g. app_name.renderers.ApiRenderer):

    from rest_framework.renderers import BaseRenderer
    from rest_framework.utils import json
    
    
    class ApiRenderer(BaseRenderer):
    
        def render(self, data, accepted_media_type=None, renderer_context=None):
            response_dict = {
                'status': 'failure',
                'data': {},
                'message': '',
            }
            if data.get('data'):
                response_dict['data'] = data.get('data')
            if data.get('status'):
                response_dict['status'] = data.get('status')
            if data.get('message'):
                response_dict['message'] = data.get('message')
            data = response_dict
            return json.dumps(data)
    

    And then in your settings file:

    REST_FRAMEWORK = {
        ...
        'DEFAULT_RENDERER_CLASSES': (
            'app_name.renderers.ApiRenderer',
        ),
        ...
    }
    

    By this action all views that extend DRF generic views will use renderer. If you needed to override setting you can use renderer_classes attribute for generic view classes and @renderer_classes decorator for api view functions.

    A comprehensive renderer class to override is available at /lib/python3.6/site-packages/rest_framework/renderers.py.

提交回复
热议问题