Ungültigkeits Memcached Keys auf save () in Django
-
02-10-2019 - |
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?
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()),
)