0

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?

Répondre

1

URLConf doit pointer vers tout appelable. Il n'y a aucune exigence stricte pour le faire pointer pour fonctionner exactement. Vous pourriez mettre en œuvre la classe de base avec vos méthodes de cache étendre ensuite:

class RealView(BaseViewWithCacheMethods): 
    def __call__(self, request): 
     if request.is_ajax(): 
      return self.ajax_view() 
     return self.html_view() 

définition URLconf serait quelque chose comme ça:

from django.conf.urls.defaults import * 
from views import RealView 

urlpattrens = patterns('', 
    (r'^$', RealView()), 
) 
+0

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