Question

J'ai vue dans Django que les utilisations memcached aux données du cache pour les vues plus fort trafic qui se fondent sur un ensemble relativement statique des données. Le mot clé est relativement: J'ai besoin invalident la clé memcached pour les données de cette URL particulière quand il a changé 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):

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 à cette variable cache_key dans sa forme « non formaté », mais je ne sais pas comment faire -. Si elle peut se faire à 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 l'hypothétique modèle personne méthode de sauvegarde)

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 sorta, et ayant des fonctions en elle comme remove_cache ou generate_cache depuis que je fais ce genre de choses sorta beaucoup . Serait-ce une meilleure idée? Si oui, comment pourrais-je appeler les vues du URLConf si elles sont dans une classe?

Était-ce utile?

La solution

URLConf doit pointer vers une appelable. Il n'y a pas stricte obligation de le faire pointer de fonctionner exactement. Vous pourriez mettre en œuvre la classe de base avec vos méthodes de cache puis l'étendre:

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()),
)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top