2009-03-03 6 views
7

après la mise en cache de plusieurs vues sur mon projet django - @ cache_page (60 * 5) - J'ai remarqué que memcached met en cache toute la vue, même l'argument request! Donc, si le premier utilisateur qui visite une page est connecté en tant que userxyz, tous les autres utilisateurs anonymes ou enregistrés qui demanderont la même page recevront la page mise en cache par l'utilisateur userxyz! Évidemment, ce n'est pas un comportement désiré ... Alors je peux tout mettre en cache sur la vue, mais pas sur l'argument de la requête? Ou memcached convient uniquement aux sessions anonymes?memcached demande de caches?

Merci à l'avance, Markos Gogoulos

Répondre

6

Si vous mélangez des données dynamiques et statiques sur une page, dans votre cas les données dynamiques est connecté comme le nom d'utilisateur de l'utilisateur, puis la mise en cache de page n'est pas le bon choix . Cela ne changerait pas si vous utilisiez un stockage de cache basé sur un fichier au lieu de memcached.

Je suggère d'essayer la mise en cache de fragments. Vous pouvez faire quelque chose comme ceci:

{% load cache %} 
{% cache 500 sidebar %} 
    .. sidebar .. 
{% endcache %} 

Cela cache le contenu de la balise de cache pendant 500 secondes avec la barre latérale d'identification.

Vous pouvez trouver plus d'informations sur la mise en cache ici:

http://docs.djangoproject.com/en/dev/topics/cache/


Si ceci est une page qui va être frappé très souvent, par exemple une page d'accueil, que vous vous sentez bénéficierait à partir de l'utilisation de la mise en cache de page sur la mise en cache de fragments (par exemple, les seules données dynamiques sont le nom d'utilisateur), il existe quelques autres options. Supposons par exemple que vous souhaitiez avoir une page complètement statique à l'exception d'une section de connexion/déconnexion en haut qui affiche différents liens selon que l'utilisateur est connecté ou non, vous pouvez vérifier l'existence d'un cookie d'authentification lorsque la page est chargée pour la première fois et afficher des données différentes sous javascript.

2

Memcached est juste un backend. Il met en cache tout ce que vous lui dites de mettre en cache. Donc, vraiment, votre question est "La mise en cache pleine page de Django convient-elle aux pages dynamiques?" Vous ne voulez probablement pas faire des pages entières en cache, juste en partie. Ou pages uniquement pour les demandes anonymes (en utilisant CACHE_MIDDLEWARE_ANONYMOUS_ONLY)

Référez-vous au livre http://www.djangobook.com/en/1.0/chapter13/

0

Vous pouvez regarder dans template fragments et la mise en cache les morceaux de contenu qui ne sont pas un utilisateur spécifique.