Django rest framework api_view vs vista normal

He estado buscando por todas partes para encontrar una explicación decente para esto, y todos se quedan cortos … ¿ Cuándo usas el decorador @api_view en lugar de una vista basada en clase con la aplicación django rest framework

Aparte del marco REST, es la misma cuestión de cuándo usar las vistas basadas en clases en comparación con las vistas basadas en funciones en general. Los CBV en Django son impresionantes, flexibles y ahorran cargas de código repetitivo, pero a veces es más rápido, más fácil y más claro usar una vista basada en funciones. Piénselo con el mismo enfoque que tomaría para escribir una vista normal en Django. REST Framework simplemente admite ambos métodos para escribir código de vista tal como se presenta en el tutorial .

Por lo general, opte por un CBV a menos que se interponga en su camino, luego hágalo simple con una vista basada en funciones y el decorador. Tanto en Django como en el Marco REST, la lógica para cosas típicas como listas, paginación y operaciones CRUD ya está escrita y se puede extender fácilmente en forma de clases y combinaciones. Si la lógica de su vista está haciendo algo notablemente diferente, una vista basada en funciones podría ser apropiada. Y, por supuesto, puede utilizar ambos enfoques en su aplicación.

Personalmente, uso la clase base APIView o el decorador @api_view solo cuando necesito hacer algo muy específico / personalizado. Por ejemplo, para mostrar una lista de URLS del punto final, agregue datos de diferentes modelos de una manera particular y así sucesivamente.

Cuando trato con la lista habitual, crear, actualizar y eliminar operaciones, uso las otras clases (Recuperar, Crear, Actualizar y Destruir vistas o Mixins).

Ejemplo de uso de @api_view decorator para hacer una lista de todos los puntos finales de mi aplicación:

 from django.core.urlresolvers import NoReverseMatch from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.reverse import reverse from .urls import urlpatterns @api_view(('GET',)) def root_endpoint(request, format=None): """ List of all the available resources of this RESTful API. """ endpoints = [] # loop over url modules for urlmodule in urlpatterns: # is it a urlconf module? try: urlmodule.urlconf_module is_urlconf_module = True except AttributeError: is_urlconf_module = False # if url is really a urlmodule if is_urlconf_module: # loop over urls of that module for url in urlmodule.urlconf_module.urlpatterns: # TODO: configurable skip url in settings # skip api-docs url if url.name in ['django.swagger.resources.view']: continue # try adding url to list of urls to show try: endpoints.append({ 'name': url.name.replace('api_', ''), 'url': reverse(url.name, request=request, format=format) }) # urls of object details will fail silently (eg: /nodes//) except NoReverseMatch: pass return Response(endpoints) 

Este código está en github .