0

我已经为我们的许多页面设置了页面级缓存。但是,有时管理员用户会登录以预览对站点的潜在更改。

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

我通读了文档,但什么也没看到。

更新:这是我基于 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)
4

1 回答 1

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.

GET这里的 if 条件告诉 django 跳过缓存,如果请求方法不是or ,则不要更新现有的缓存数据HEAD

同样,如果用户是管理员,您可以在跳过缓存的位置添加检查。大致看起来像这样:

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装饰器使用 djangoCacheMiddleware扩展了 FetchFromCacheMiddleware 和 UpdateCacheMiddleware 的功能。

现在您必须制作自己的版本CacheMiddlewarecache_page装饰器。这个custom_cache_page装饰器将调用你CustomCacheMiddleware的扩展你CustomFetchFromCacheMiddleware和 django 的UpdateCacheMiddleware.

完成 CustomCacheMiddleware 后,您必须将 django 的 CacheMiddleware 替换为您自己的。这可以通过更改 settings.py 中的 MIDDLEWARE_CLASSES 元组来完成。

于 2017-01-16T16:21:19.763 回答