Saltar al contenido

¿Cómo sobrescribir la clase de respuesta en Django Rest Framework (DRF)?

Ya no tienes que buscar más en otras webs ya que llegaste al espacio exacto, poseemos la solución que buscas y sin problema.

Solución:

Para resolver esto, la mejor práctica (que DRF ha propuesto) es usar clases de ‘renderizador’. Un renderizador manipula y devuelve una respuesta estructurada.

Django usa renderizadores como Template Renderer y DRF se beneficia de esta característica y proporciona API Renderers.

Para hacerlo, puede proporcionar este renderizador en un paquete (por ejemplo, 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)

Y luego en su archivo de configuración:

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

Mediante esta acción, todas las vistas que amplían las vistas genéricas de DRF utilizarán el renderizador. Si necesita anular la configuración, puede usar renderer_classes attribute para clases de vista genéricas y @renderer_classes decorador para funciones de vista api.

Una clase de renderizador integral para anular está disponible en /lib/python3.6/site-packages/rest_framework/renderers.py.

solo una adición: Prefiero heredar de JSONRenderer. De esa manera, obtendrá el buen formato y la sangría listos para usar.

    from rest_framework.renderers import JSONRenderer
    
    class CustomRenderer(JSONRenderer):
          
          def render(self, data, accepted_media_type=None, renderer_context=None):
              response = 
                 'error': False,
                 'message': 'Success',
                 'data': data
              

              return super(CustomRenderer, self).render(response, accepted_media_type, renderer_context)

Luego en tus puntos de vista:

    from rest_framework.renderers import BrowsableAPIRenderer
    from api.renderers import CustomRenderer

    class MyViewSet(viewsets.ModelViewSet):
          renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
          
          ...

Cuando se usa con el BrowsableAPIRenderer como se muestra arriba, obtiene su respuesta personalizada con un formato agradable en la API navegable de DRF

Al final de la página puedes encontrar las aclaraciones de otros usuarios, tú de igual forma puedes mostrar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *