Mise en cache sur l'ensemble du site avec Django - problèmes avec les pages protégées par mot de passe lors de la déconnexion

StackOverflow https://stackoverflow.com/questions/1608521

  •  05-07-2019
  •  | 
  •  

Question

J'ai récemment implémenté la mise en cache à l'échelle du site à l'aide de memcached sur mon application Django. définir le TTL sur environ 500 secondes et mettre en place des caches per view sur d'autres parties de l'application Web .

Le problème que j'ai, c'est que lorsqu'un utilisateur se déconnecte, car il s'agit d'un formulaire, le site se comporte comme prévu. Toutefois, s'il se rend ensuite dans une partie du site protégée par un mot de passe, l'application se comporte comme si elle s'était toujours connectée. , sauf s’ils cliquent sur "Actualiser". Je suis nouveau dans la mise en cache et je me demande si je peux faire quelque chose d'intelligent pour empêcher cela?

Était-ce utile?

La solution

J'ai rencontré des problèmes similaires. La méthode standard de Django consiste à désactiver le cache pour les utilisateurs authentifiés.

#settings.py
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True

Cela fonctionne bien si différents utilisateurs voient différentes pages (par exemple, leur nom d'utilisateur) et que vous ne pouvez pas en avoir une version.

Mais s'il n'y a que 2 versions de page: pour les utilisateurs authentifiés et pour les autres, il n'est pas bon de désactiver complètement le cache pour les utilisateurs authentifiés. J'ai écrit une application qui, en plus de tout, permet d'affiner régler le cache dans ce cas.

Mettre à jour.

BTW: vous avez mentionné que lorsque vous cliquez sur "Actualiser", la version correcte de la page est reçue. Cela signifie que le problème est le cache côté client (en-tête Expires ou E-tag), pas le cache du serveur.

Pour empêcher la mise en cache côté client (vous devez le faire si vous avez plusieurs versions de page sous la même URL), utilisez @cache_control (must_revalidate = True) décorateur.

Autres conseils

Dans la vue d’une partie du site protégée par un mot de passe, vérifiez-vous si l’utilisateur est enregistré ou anonyme avant d’extraire les données (et éventuellement de les mettre en cache)?

Vous devriez. Django vous aide avec un décorateur requis que vous pouvez placer sur la vue. Regarde ça: http://docs.djangoproject.com/en / dev / topics / auth / # the-login-required-decorator

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top