从缓存中排除中间件

时间:2015-10-21 15:16:51

标签: django django-middleware django-cache

我有非常简单的中间件来跟踪对象的“命中”数量。

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 个答案:

答案 0 :(得分:1)

FetchFromCache中间件在process_request期间从缓存中获取页面。

这意味着永远不会调用process_view中间件。

您可以尝试更改中间件以覆盖process_request。但是,这可能很棘手,因为您无法访问request.resolver_match