DRF,为as_view()缓存?

时间:2017-04-25 13:26:03

标签: django django-rest-framework django-cache

在我看来,我经常使用API​​View的as_view()来生成json。

我想缓存回复并尝试以下但是它不会工作

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)

然后,我打电话给

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)

当我使用浏览器请求视图时,它会正确缓存,但在使用as_view()

时不会

1 个答案:

答案 0 :(得分:3)

CBV文档中列出了一些策略:

在urls.py路线中添加装饰器,例如login_required(ViewSpaceIndex.as_view(..)) 使用method_decorator例如

装饰您的CBV调度方法
from django.utils.decorators import method_decorator

@method_decorator(login_required, name='dispatch')
class MyViewSet(TemplateView):
    template_name = 'secret.html'

在Django 1.9之前,你不能在类上使用method_decorator,所以你必须覆盖调度方法:

class MyViewSet(TemplateView):

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(MyViewSet, self).dispatch(*args, **kwargs)