Frage

Ich habe einen Blick in Django bekommt, dass Anwendungen für den mehr stark frequentierten Blick auf Cache-Daten Memcached, die Daten auf einem relativ statischen Satz verlassen. Das Schlüsselwort ist relativ: Ich brauche die Memcached Schlüssel für diese bestimmte URL der Daten ungültig, wenn es in der Datenbank geändert wird. Um so klar wie möglich, hier ist das Fleisch einer‘Kartoffel der Ansicht (Person ist ein Modell, ist die Cache 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

Was will ich ist an diesen cache_key Variable in it „unformatiert“ Form zu tun, aber ich bin nicht sicher, wie dies zu tun -. Wenn es überhaupt getan werden kann,

Für den Fall, es ist schon etwas, dies zu tun, ist hier, was ich damit tun will (dies ist aus der hypothetischen der Person Modell Speichermethode)

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()

Ich denke über eine Ansichtsklasse für diese sorta Sachen zu machen, und mit Funktionen in ihm wie remove_cache oder generate_cache da ich diesen sorta Sachen tun, um ein Los . Wäre das eine bessere Idee? Wenn ja, wie würde ich die Ansichten in der URLconf anrufen, wenn sie in einer Klasse sind?

War es hilfreich?

Lösung

URLconf sollte jeden abrufbaren zeigen. Es gibt keine strenge Anforderung, um es genau darauf an Funktion zu machen. Sie könnten Basisklasse mit dem Cache-Methoden implementieren dann verlängern sie:

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

URLconf Definition wäre etwas wie folgt aus:

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

urlpattrens = patterns('',
    (r'^$', RealView()),
)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top