我为许多网页设置了页面级缓存。但是,管理员用户偶尔会登录以预览对网站的潜在更改。
有没有办法只为这些用户禁用页面级缓存?
我通读了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)
答案 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跳过缓存,如果请求方法不是GET
或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
装饰器使用django的CacheMiddleware
,它扩展了FetchFromCacheMiddleware和UpdateCacheMiddleware的功能。
现在,您必须制作自己的CacheMiddleware
和cache_page
装饰器版本。此custom_cache_page
装饰工具会调用CustomCacheMiddleware
来扩展您的CustomFetchFromCacheMiddleware
和django UpdateCacheMiddleware
。
完成CustomCacheMiddleware之后,您将不得不用自己的替换django的CacheMiddleware。这可以通过在settings.py中更改MIDDLEWARE_CLASSES元组来完成。