你如何在Django基于类的视图中使用@cache_page装饰器?

3

目前看来唯一有效的方法是在urls.py文件中添加装饰器,这样做很不美观。

有没有办法在视图中应用这个装饰器?

class HomeView(View):
    @method_decorator(cache_page(60 * 60))
    def dispatch(self, *args, **kwargs):
        return super(HomeView, self).dispatch(*args, **kwargs)

我尝试了上述方法,但似乎并没有起作用。
4个回答

5
您可以使用method_decorator来装饰视图的dispatch()方法,参考文档。最简洁的方式是这样的:
from django.utils.decorators import method_decorator
from django.views.generic import ListView

@method_decorator(cache_page(60*60), name='dispatch')
class MyListView(ListView):
    # Your view code here.

2

在urls.py中使用它

url(r'^home_url/?$', cache_page(60*60)(HomeView.as_view())),

我宁愿不使用urls.py,就像我在第一行中所说的,“似乎唯一有效的方法是在urls.py中添加装饰器,这很丑陋。” - daniels

1

method_decorator 方法应该可以很好地解决问题(我们在项目中正在使用它)。您确定这是问题所在吗?

这是我们正在使用的代码(名称已更改)-看起来与您的相似

class MyClassView(CommonMixin, View):
    @method_decorator(cache_page(60*60, cache='cache1'))
    def get(self, request):
                .....

当我在urls.py中添加装饰器时,我会看到文件被创建在我的缓存文件夹中(这个文件夹是我在settings.py中定义的),但是当我像上面的例子中使用method_decorator时,没有文件被创建,所以我认为它不起作用。(我在代码中做出任何更改后都重新启动了开发服务器) - daniels
你能提供一个对你有效的代码片段吗? - daniels
@daniels,这似乎是你的代码,但我已经更改了名称并将其添加到答案中。 - eran
仍然不起作用...不知道问题可能是什么...我在控制台中也没有收到任何错误或其他信息。只是文件没有被创建在缓存文件夹中,而如果我在urls.py中这样做,它们就会被创建。使用最新版本的Django 1.8.6。 - daniels

1

假设我们想要缓存myView视图的结果 -

from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def myView(request, year, month):
    text = "Displaying articles of : %s/%s"%(year, month)
    return HttpResponse(text)

and urls.py将会是:

urlpatterns = patterns('myapp.views',url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'myView', name = 'articles'),)

我们如何通过使用这个装饰器来缓存视图中使用的查询集?我无法做到这一点。如果它缓存了这个视图的结果,那么它存储在哪个键下?请回答这两个问题。 - Luv33preet
请遵循 https://docs.djangoproject.com/en/1.10/topics/db/queries/#caching-and-querysets 和 https://docs.djangoproject.com/en/1.10/topics/db/optimization/#understand-querysets。这些将解决您的问题。 - Ajay Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接