Cache_page с представлениями класса
Я пытаюсь сделать cache_page с представлениями на основе классов (TemplateView), и я не могу. Я следовал инструкциям здесь:
Django - кэширование URL-адресов, недоступных для классов, основанных на классе
а также здесь:
https://github.com/msgre/hazard/blob/master/hazard/urls.py
Но я получаю эту ошибку:
cache_page has a single mandatory positional argument: timeout
Я прочитал код для cache_page, и он имеет следующее:
if len(args) != 1 or callable(args[0]):
raise TypeError("cache_page has a single mandatory positional argument: timeout")
cache_timeout = args[0]
что означает, что он не допускает более одного аргумента. Есть ли другой способ заставить cache_page работать? Я копался в этом на некоторое время...
Похоже, что предыдущие решения больше не будут работать
Ответы
Ответ 1
В соответствии с документами кэширования docs правильный способ кэширования CBV -
url(r'^my_url/?$', cache_page(60*60)(MyView.as_view())),
Обратите внимание, что ответ, с которым вы связаны, устарел. Старый способ использования декоратора был удален (набор изменений).
Ответ 2
еще один хороший пример CacheMixin
из cyberdelia github
class CacheMixin(object):
cache_timeout = 60
def get_cache_timeout(self):
return self.cache_timeout
def dispatch(self, *args, **kwargs):
return cache_page(self.get_cache_timeout())(super(CacheMixin, self).dispatch)(*args, **kwargs)
usecase:
from django.views.generic.detail import DetailView
class ArticleView(CacheMixin, DetailView):
cache_timeout = 90
template_name = "article_detail.html"
queryset = Article.objects.articles()
context_object_name = "article"
Ответ 3
Я не нашел хорошего решения для кеша для представлений на основе классов и создал свой собственный: https://gist.github.com/svetlyak40wt/11126018
Это микширование для класса. Добавьте его перед основным базовым классом и реализуйте метод get_cache_params следующим образом:
def get_cache_params(self, *args, **kwargs):
return ('some-prefix-{username}'.format(
username=self.request.user.username),
3600)
Ответ 4
Я создал этот маленький генератор mixin для выполнения кэширования в файле views
, а не в URL conf:
def CachedView(cache_time=60 * 60):
"""
Mixing generator for caching class-based views.
Example usage:
class MyView(CachedView(60), TemplateView):
....
:param cache_time: time to cache the page, in seconds
:return: a mixin for caching a view for a particular number of seconds
"""
class CacheMixin(object):
@classmethod
def as_view(cls, **initkwargs):
return cache_page(cache_time)(
super(CacheMixin, cls).as_view(**initkwargs)
)
return CacheMixin
Ответ 5
Еще один ответ, мы обнаружили, что это является самым простым и специфичным для шаблонных представлений.
class CachedTemplateView(TemplateView):
@classonlymethod
def as_view(cls, **initkwargs): #@NoSelf
return cache_page(15 * 60)(super(CachedTemplateView, cls).as_view(**initkwargs))
Ответ 6
Вы можете просто украсить сам класс, а не переопределять метод отправки или использовать mixin.
Например
from django.views.decorators.cache import cache_page
from django.utils.decorators import method_decorator
@method_decorator(cache_page(60 * 5), name='dispatch')
class ListView(ListView):
...
Django docs на украшение метода в представлении на основе класса.