2017-04-25 60 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