Invalidantes Memcached clés sur save () dans Django
-
02-10-2019 - |
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?
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()),
)