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

あなたが管理者ユーザーは常に代わりにキャッシュされたの新鮮なコンテンツを参照するように、ジャンゴが提供する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または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. 

UPDATEを:cache_pageデコレータは使用していますFetchFromCacheMiddlewareとUpdateCacheMiddlewareの機能を拡張DjangoのCacheMiddleware

CacheMiddlewarecache_pageデコレータの独自のバージョンを作成する必要があります。このcustom_cache_pageデコレータは、CustomFetchFromCacheMiddlewareとdjangoのUpdateCacheMiddlewareを拡張するCustomCacheMiddlewareを呼び出します。

CustomCacheミドルウェアを完成したら、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

関連する問題