J'ai une vue dans Django qui utilise memcached pour mettre en cache des données pour les vues à trafic élevé qui reposent sur un ensemble de données relativement statique. Le mot clé est relativement: J'ai besoin d'invalider la clé memcached pour les données de cette URL particulière quand elle est changée dans la base de données. Pour être aussi clair que possible, voici la viande une » pommes de terre de la vue (personne est un modèle, le cache est django.core.cache.cache):Invalidation des touches Memcached sur save() dans Django
def person_detail(request, slug):
if request.is_ajax():
cache_key = "%s_ABOUT_%s" % settings.SITE_PREFIX, slug
# Check the cache to see if we've already got this result made.
json_dict = cache.get(cache_key)
# Was it a cache hit?
if json_dict is None:
# That's a negative Ghost Rider
person = get_object_or_404(Person, display = True, slug = slug)
json_dict = {
'name' : person.name,
'bio' : person.bio_html,
'image' : person.image.extra_thumbnails['large'].absolute_url,
}
cache.set(cache_key)
# json_dict will now exist, whether it's from the cache or not
response = HttpResponse()
response['Content-Type'] = 'text/javascript'
response.write(simpljson.dumps(json_dict)) # Make sure it's all properly formatted for JS by using simplejson
return response
else:
# This is where the fully templated response is generated
Ce que je veux faire est d'obtenir à ce cache_key variable dans sa forme "non formatée", mais je ne suis pas sûr de savoir comment le faire - si cela peut être fait du tout.
Juste au cas où il y a déjà quelque chose à faire, voici ce que je veux faire avec elle (ce qui est de la méthode de sauvegarde hypothétique modèle personne)
def save(self):
# If this is an update, the key will be cached, otherwise it won't, let's see if we can't find me
try:
old_self = Person.objects.get(pk=self.id)
cache_key = # Voodoo magic to get that variable
old_key = cache_key.format(settings.SITE_PREFIX, old_self.slug) # Generate the key currently cached
cache.delete(old_key) # Hit it with both barrels of rock salt
# Turns out this doesn't already exist, let's make that first request even faster by making this cache right now
except DoesNotExist:
# I haven't gotten to this yet.
super(Person, self).save()
Je pense à faire une classe de vue pour ce genre de choses, et ayant des fonctions comme remove_cache
ou generate_cache
depuis que je fais ce genre de choses un lot. Serait-ce une meilleure idée? Si oui, comment j'appellerais les vues dans l'URLconf si elles sont dans une classe?
Ceci est l'approche que j'ai pris jusqu'à présent, un succès limité et très en cours. Je posterai la classe ici une fois que j'en aurai fini avec elle. – Zack