2017-06-13 5 views
0

J'utilise memcached dans Django pour mettre en cache le site entier.django cache.clear() fin de session (déconnexion)

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

J'ai ajouté un code dans une méthode de gestionnaire de signal post-enregistrement pour effacer le cache lorsque certains objets sont créés ou mis à jour dans le modèle.

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() 

Malheureusement, après la création d'un nouvel objet, l'utilisateur est déconnecté.

Je pense que la raison peut être que je mets en cache des sessions.

# 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" 

Devrais-je utiliser le cache par vue peut-être?

+0

On ne sait pas ce que « cache site entier » est. –

+0

J'ai mis en cache le site entier comme décrit dans django docs, tapant les requêtes au niveau du middleware, en utilisant 'django.middleware.cache.UpdateCacheMiddleware' et 'django.middleware.cache.FetchFromCacheMiddleware'. J'ai ajouté un lien vers les documents. –

+0

effacer le cache effacera toutes les sessions enregistrées. Vous devriez soit utiliser un backend de session différent ou changer la façon dont vous cachez. Avez-vous vraiment besoin de mettre en cache chaque requête? –

Répondre

0
from django.contrib.auth import update_session_auth_hash 

update_session_auth_hash(request, user) 

Passez la requête et l'utilisateur dans la méthode ci-dessus lorsque vous effacez un cache. mais selon ton chemin. vous effacez le cache dans le signal qui n'a pas de demande. Donc, si vous mettez à jour le modèle d'annonce de l'administrateur alors. override admin save_model() méthode pour enregistrer et ici vous pouvez obtenir l'utilisateur et la demande, donc appelez au-dessus update_session_auth_hash après effacer le cache. Il ne sera pas déconnecté utilisateur. Si vous la mise à jour des données de vue propre puis utiliser même pour appeler la méthode qui continue utilisateur comme connecté.

Modifier

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

L'objet est créé à partir d'un CreateVIew. J'ai remplacé la méthode form_valid et appelé update_session_auth_hash (request, user) avant d'enregistrer l'objet et de vider le cache, mais l'utilisateur est toujours déconnecté. –

+0

Vérifiez la réponse mise à jour –