从缓存中排除中间件
Exclude middleware from caching
我有一个非常简单的中间件,可以跟踪对象的 "hits" 个数。
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'
FetchFromCache
中间件正在 process_request
期间从缓存中获取页面。
这意味着永远不会调用 process_view
中间件。
您可以尝试更改您的中间件以覆盖 process_request
。但是,这可能很棘手,因为您无法访问 request.resolver_match
.
我有一个非常简单的中间件,可以跟踪对象的 "hits" 个数。
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'
FetchFromCache
中间件正在 process_request
期间从缓存中获取页面。
这意味着永远不会调用 process_view
中间件。
您可以尝试更改您的中间件以覆盖 process_request
。但是,这可能很棘手,因为您无法访问 request.resolver_match
.