En mi opinión, a menudo uso as_view as_view() de APIView para generar json.
Me gustaría almacenar en caché la respuesta e intenté lo siguiente, pero no funcionará
def some_complex_view(self, request, *args, **kwargs): pass @method_decorator(cache_page(60, key_prefix='drf')) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs)Entonces, llamo
def my_view(request, *args, **kwargs): json_data = MyViewSet.as_view({'get': 'some_complex_view'})(request, format='json') data = { 'my_data': json_data } return render(request, 'my_template.html', data) Se almacena en caché correctamente cuando solicito la vista usando el navegador, pero no lo hará cuando use as_view()
Hay algunas estrategias enumeradas en los documentos de CBV:
Agregue el decorador en su ruta urls.py, por ejemplo, login_required(ViewSpaceIndex.as_view(..)) Decore el método de envío de su CBV con un method_decorator , por ejemplo,
from django.utils.decorators import method_decorator @method_decorator(login_required, name='dispatch') class MyViewSet(TemplateView): template_name = 'secret.html'Antes de Django 1.9, no puede usar method_decorator en la clase, por lo que debe anular el método de envío:
class MyViewSet(TemplateView): @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(MyViewSet, self).dispatch(*args, **kwargs)