2017-06-13 18 views
0

私はDjangoでmemcachedを使用してサイト全体をキャッシュしています。django cache.clear()セッション終了(ログアウト)

https://docs.djangoproject.com/en/1.11/topics/cache/#the-per-site-cache

私は、特定のオブジェクトがモデルに作成または更新されたキャッシュをクリアするには、ポストセーブシグナルハンドラメソッドにいくつかのコードを追加しました。

from proximity.models import Advert 

# Cache 
from django.core.cache import cache 

@receiver(post_save, sender=Advert) 
def save_advert(sender, instance, **kwargs): 
    # Clear cache 
    cache.clear() 

残念ながら、新しいオブジェクトを作成した後、ユーザーはログアウトします。

私はその理由が私がセッションをキャッシュしていると考えることができると思います。

# Cache config 
CACHE_MIDDLEWARE_SECONDS = 31449600 #(approximately 1 year, in seconds) 
CACHE_MIDDLEWARE_KEY_PREFIX = COREAPP 
CACHES = { 
    "default": { 
     "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", 
     "LOCATION": "127.0.0.1:11211", 
    } 
} 
SESSION_ENGINE = "django.contrib.sessions.backends.cache" 

ビュー単位のキャッシュを使用する必要がありますか?

+0

それは、「サイト全体をキャッシュ」何不明です。 –

+0

「django.middleware.cache.UpdateCacheMiddleware」と「django.middleware.cache.FetchFromCacheMiddleware」を使用して、djangoドキュメントで説明されているようにサイト全体をキャッシュし、ミドルウェアレベルでリクエストをチャンクしました。私はドキュメントへのリンクを追加しました。 –

+0

キャッシュをクリアすると、保存されているセッションはすべて消去されます。別のセッションバックエンドを使用するか、キャッシュする方法を変更する必要があります。すべての単一リクエストをキャッシュする必要がありますか? –

答えて

0
from django.contrib.auth import update_session_auth_hash 

update_session_auth_hash(request, user) 

キャッシュをクリアすると上記の方法でリクエストとユーザーを渡します。あなたの道に応じて。要求のない信号のキャッシュをクリアしています。ですから、広告モデルを管理者から更新する場合は、オーバーライド管理save_model()メソッドを保存し、ここであなたはユーザーと要求を得ることができるので、上記のupdate_session_auth_hashをクリアキャッシュの後に呼び出します。ユーザーはログアウトしません。あなたは自分のビューからのデータを更新する場合は、ユーザーがログインしていることを継続メソッドを呼び出すために同じを使用しています。

編集

def form_valid(self, form) 
    user = self.request.user 
    form.save() # When you save then signal will call that clear your cache 
    update_session_auth_hash(self.request, user) 
+0

オブジェクトはCreateVIewから作成されています。オブジェクトを保存してキャッシュをクリアする前に、form_validメソッドをオーバーライドしてupdate_session_auth_hash(request、user)を呼び出しましたが、まだログアウトしています。 –

+0

更新された回答を確認する –

関連する問題