Исключить промежуточное программное обеспечение из кэширования
У меня есть очень простое промежуточное программное обеспечение, которое отслеживает количество "попаданий" объекта.
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
,