Django - 禁用用户的页面级缓存

时间:2017-01-16 15:42:22

标签: django caching django-cache django-caching

我为许多网页设置了页面级缓存。但是,管理员用户偶尔会登录以预览对网站的潜在更改。

有没有办法只为这些用户禁用页面级缓存?

我通读了the docs,但我没有看到任何内容。

更新: 这是基于v1k45答案的尝试:

from django.middleware.cache import FetchFromCacheMiddleware


logger = logging.getLogger(__name__)


class ExceptImpersonateFetchFromCacheMiddleware(FetchFromCacheMiddleware):
    def process_request(self, request):
        # Break out of caching is we're using impersonate
        if request.user and hasattr(request.user, 'is_impersonate') and request.user.is_impersonate:
            logger.warning("Skipping cache_page for user %s because it is impersonation" % str(request.user))
            request._cache_update_cache = False
            return None
        # Normal flow:
        return super(ExceptImpersonateFetchFromCacheMiddleware, self).process_request(request)

1 个答案:

答案 0 :(得分:1)

您可以扩展django提供的CacheMiddleware,以便管理员用户始终可以看到新内容而不是缓存。

查看FetchFromCacheMiddleware的源代码,您可以看到以下代码段:

def process_request(self, request):
    [...]
    if request.method not in ('GET', 'HEAD'):
        request._cache_update_cache = False
        return None  # Don't bother checking the cache.

if条件告诉django跳过缓存,如果请求方法不是GETHEAD,则不会更新现有的缓存数据。

同样,如果用户是管理员,您可以添加检查以跳过缓存。大概它会是这样的:

def process_request(self, request):
    [...snip..]
    if request.user.is_staff:
        request._cache_update_cache = False
        return None  # Don't bother checking the cache.

更新cache_page装饰器使用django的CacheMiddleware,它扩展了FetchFromCacheMiddleware和UpdateCacheMiddleware的功能。

现在,您必须制作自己的CacheMiddlewarecache_page装饰器版本。此custom_cache_page装饰工具会调用CustomCacheMiddleware来扩展您的CustomFetchFromCacheMiddleware和django UpdateCacheMiddleware

完成CustomCacheMiddleware之后,您将不得不用自己的替换django的CacheMiddleware。这可以通过在settings.py中更改MIDDLEWARE_CLASSES元组来完成。