2015-10-21 2 views
1

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

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 

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

Поле «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.

+0

Благодарим за ответ, он работает с process_request. Я могу получить resolvers_match, импортируя resolvers (resolve (request.path)). Плохая вещь, теперь каждый запрос разрешается два раза:/Но я не вижу большой разницы в производительности. Я отмечу это, как и завтра. Может быть, у кого-то есть другая идея, до тех пор – kotlet

 Смежные вопросы

  • Нет связанных вопросов^_^