2017-01-16 103 views
0

我为许多页面设置了页面级缓存。但是,一段时间后,管理员用户登录以预览对该站点的潜在更改。Django - 禁用用户的页面级缓存

有没有一种方法来禁用页面级缓存只是为这些用户?

我通过阅读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

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

的,如果这里的条件告诉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. 

UPDATE:该cache_page装饰使用Django的CacheMiddleware延伸FetchFromCacheMiddleware和UpdateCacheMiddleware的功能。现在

你必须使自己的CacheMiddlewarecache_page装饰的版本。这custom_cache_page装饰将打电话给你的CustomCacheMiddleware它扩展你的CustomFetchFromCacheMiddleware和Django的UpdateCacheMiddleware

你已经完成了CustomCacheMiddleware后,你必须用自己取代Django的CacheMiddleware。这可以通过更改settings.py中的MIDDLEWARE_CLASSES元组来完成。

+0

这看起来很有希望!谢谢!什么是最好的方法来做到这一点?我在修改Django自己的源代码,还是有更聪明的方法? – Greg

+0

您并未修改django的源代码,您只是更换了django提供的中间件,该中间件可随时更换。所有你需要做的就是把你的扩展类的Python路径放在settings.py的'MIDDLEWARE_CLASSES'中。 – v1k45

+0

您是否在说我的新类“FetchFromCacheMiddleware”以覆盖Django的版本?我没有在MIDDLEWARE_CLASSES的settings.py中看到“FetchFromCacheMiddleware”。 – Greg