Django-用户禁用页面级缓存



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

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

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

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

您可以扩展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.

UPDATEcache_page装饰器使用django的CacheMiddleware,它扩展了FetchFromCacheMiddleware和UpdateCacheMiddleware。

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

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

相关内容

  • 没有找到相关文章

最新更新