Исключить промежуточное ПО из кэширования

У меня есть очень простое промежуточное программное обеспечение, которое отслеживает количество «попаданий» объекта.

class HitCount():
    def process_view(self, request, view_func, view_args, view_kwargs):
        if request.resolver_match.url_name == 'article_view':
            try:
                Article.objects.filter(slug=view_kwargs['slug']).update(hit_count=F('hit_count')+1)
            except:
                pass

Проблема в том, что он не работает должным образом, когда " для каждого сайта" кеш включен.

Поле «hit_count» (PositiveIntegerField) обновляется только один раз в 5 минут (время ожидания кеша 300 с), независимо от того, сколько раз страница была посещена в течение этих «5 минут». Это не обязательно должно быть точным, потому что поле «hit_count» даже не отображается на лицевой стороне. Мне это нужно только, чтобы заказывать статьи через популярность. Но "погрешность измерения 5 минут" - это слишком. Как я могу исключить это промежуточное ПО из кэширования? Нужно ли отключать кеш для всего представления?

файл настроек, я попытался изменить порядок промежуточного программного обеспечения, но безрезультатно.

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'blog.middleware.HitCount',
    'django.middleware.cache.FetchFromCacheMiddleware',
)

Посмотреть

class ArticleDetailView(DetailView):
    queryset = Article.objects.published()
    template_name = 'article.html'

person m51    schedule 21.10.2015    source источник


Ответы (1)


Промежуточное ПО FetchFromCache извлекает страницу из кеша во время process_request.

Это означает, что промежуточное ПО process_view никогда не вызывается.

Вместо этого вы можете попробовать изменить свое промежуточное ПО, чтобы переопределить process_request. Однако это может быть непросто, потому что у вас не будет доступа к request.resolver_match.

person Alasdair    schedule 21.10.2015
comment
Спасибо за ответ, он работает с process_request. Я могу получить resolvers_match, импортировав распознаватели (resolve(request.path)). Плохо то, что теперь каждый запрос обрабатывается два раза :/ Но я не вижу большой разницы в производительности. Я отмечу это как ответ завтра. Может у кого есть другая идея, а пока - person m51; 21.10.2015