2017-01-16 25 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