2017-04-25 76 views
1

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

我想缓存响应,并尝试了以下,但它不会工作

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

如何直接调用视图时构造请求? – knbk

+0

什么是你的Django版本? –

+0

@knbk:我在django查看功能,它有'请求' – eugene

回答

1

在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) 
+0

是的,它在我从浏览器(网络)请求url时起作用,但如果我用'as_view()'直接调用view方法则不会。 – eugene