【问题标题】:DRF, caching for as_view()?DRF,为 as_view() 缓存?
【发布时间】:2017-04-25 13:26:02
【问题描述】:

在我看来,我经常使用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()时不会缓存

【问题讨论】:

  • 直接调用视图时如何构造请求?
  • 你的 django 版本是多少??
  • @knbk:我在 django 视图函数中,它有“请求”
  • @SathishKumarVG 我用的是 1.9,如果需要愿意升级。
  • 我不完全确定你的意思,你能显示代码吗?

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


【解决方案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,所以你必须重写dispatch方法:

class MyViewSet(TemplateView):

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

【讨论】:

  • 是的,当我从浏览器(网络)请求 url 时它可以工作,但如果我直接使用 as_view() 调用 view 方法则不会。
猜你喜欢
  • 2016-11-24
  • 2019-01-01
  • 2016-09-13
  • 2017-08-23
  • 2018-09-30
  • 2013-01-19
  • 2014-09-03
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多