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

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

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'

1 ответ

Решение

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

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

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

Другие вопросы по тегам