Mettre en cache le résultat de la requête dans django?
Je suis en train de cache résultats de la requête sur mon django app. Cependant, il semble que c'est la mise en cache l'ensemble de l'application. J'ai essayé de suivre logi:
def cacheView():
result = cache.get('key')
if result is None:
result = Model.objects.get(id=1)
cache.set('key', 'result')
Je suis à l'appel de cette méthode lorsque l'utilisateur se connecte. Cependant, si j'essaie de vous déconnecter après la connexion, il me tient sur la même page que si je suis toujours connecté. J'ai essayé de suivre la documentation de Django sur le cache à http://docs.djangoproject.com/en/1.2/topics/cache/ mais sans succès.
Autre chose que j'ai essayé, c'est que si j'essaie d'utiliser le cache décorateur juste au-dessus de la vue:
@cache_control(max_age=1000)
def cacheView():
...
il le fait, il donne un message d'erreur indiquant "en-tête de réponse non défini". Je suis nouveau sur django et sûr que j'ai raté quelque chose. Une idée?
OriginalL'auteur jindals | 2010-09-27
Vous devez vous connecter pour publier un commentaire.
RTFM 🙂 Officielle de Django Docs: La mise en cache et QuerySets
et:
La mise en cache se fait automatiquement en cas de QuerySets (résultats de Requêtes).
EDIT:
Comme pour votre code collé dans la question.
Si la clé n'existe pas déjà dans le cache, il faut le créer avec
add()
méthode, mais rappelez-vous qu'il arrive à expiration par défaut après 30sec. Si vous souhaitez les conserver plus longtemps, vous devez ajouter l'option timeout àadd()/set()
méthode.Si vous voulez cache pour l'ensemble de votre site (pour ie. les décorateurs comme vous l'avez utilisé, vous devez ajouter la bonne middleware pour votre
MIDDLEWARE_CLASSES
dans settings.py (dans l'ordre exact, parce que le middleware importance de l'ordre, il est chargé, un par un, comme vous les définir):Si vous ne les avez pas, alors vous serez recevoir de mauvais en-tête des erreurs chaque fois que vous allez utiliser la mise en cache par le site de capacités.
Par défaut, django utilise de la mémoire locale pour stocker le cache. Si vous avez défini autres backend de cache puis django va l'utiliser.
Encore une question, faites U ont besoin de stocker ces données pour un temps très long?
J'ai lu toutes vos question une fois de plus et j'espère que je n'ai pas mal vous comprendre. Si vous avez besoin d'agir directement sur le cache avec l'objet de votre coup d'oeil ici: docs.djangoproject.com/en/dev/topics/cache/... - je pense qu'il va vous expliquer tous vos doutes. Je veux dire la mise en cache tout point de vue peut-être exagéré - dans certains cas, vous souhaitez mettre en cache uniquement une partie des données et pour que vous devez utiliser django.de base.cache de paquet. Il est assez facile - il vous suffit d'écrire à cela avec la méthode set() et de vous lire via la méthode get (). 🙂
Je suis en train de stocker le résultat dans le cache pendant presque 1 heure.
OriginalL'auteur bx2
À partir de votre exemple, il n'est pas clair pourquoi la déconnexion serait un échec, mais il ne devrait pas être quelque chose à voir avec la mise en cache d'un modèle (sauf si vous êtes en cache le modèle de l'Utilisateur et en utilisant la mise en cache de l'utilisateur pour l'authentification au lieu de la demande.utilisateur?)
C'est bien d'utiliser le cache.obtenir et mettre en cache.définir la façon dont vous êtes (jeu de créer une nouvelle clé si elle n'existe pas).
La mise en cache des requêtes peut être difficile que vous devez prendre soin d'invalider le cache de la modification des données afin de ne pas servir rassis résultats.
Un oeil à ces requêtes bibliothèques de mise en cache de Django qui visent à rendre les choses plus faciles:
http://jbalogh.me/2010/02/09/cache-machine/
http://packages.python.org/johnny-cache/queryset_cache.html
OriginalL'auteur Anentropic