Einzelne Views mit cache_page und Memcached cachen
Zuerst einmal müssen ein paar Einträge in der settings.py gemacht werden, damit man das Cache-Framework von Django benutzen kann. In meiner settings.py steht jetzt folgendes:
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
CACHE_MIDDLEWARE_PREFIX = 'myproject'
CACHE_MIDDLEWARE_SECONDS = 60
Der View den man cachen möchte wird mit dem cache_page Decorator versehen. (Die Python 2.4 Syntax @cache_page() funktioniert zumindestens mit Django 0.96.1 nicht)
from django.views.decorators.cache import cache_page
def myview(request):
#do something
return render_to_resonse('template', context)
myview = cache_page(myview, 60*60) # <- hier wird gecached
Eine Middleware sorgt dafür das nach dem Editieren von Objekten die gecachte Variante des Views gelöscht wird.
Zuerst wird der Edit-View etwas bearbeitet:
object.save()
request.session['purge'] = page.slug # <- der entscheidende Teil
return HttpResponseRedirect("/foo/%s/" % page.slug)
Und dann wird die folgende Middleware aktiviert. Durch den Redirect nach dem Speichern und den Wert in der Session wird durch die Middleware der Cache gelöscht (und der Wert aus der Session wieder entfernt).
from django.utils.cache import get_cache_key
from django.core.cache import cache
class CachePurgeMiddleware(object):
def process_request(self, request):
if 'purge' in request.session:
k = get_cache_key(request)
try:
cache.delete(k)
except:
pass
del request.session['purge']
To be continued ...
Benchmarks
Eine kurze Messung mit ab -n 200 -c 20 (Apache Bench) brachte folgendes Ergebnis:
Ohne Caching:
HTML transferred: 735600 bytes Requests per second: 47.23 [#/sec] (mean)
Mit Caching:
HTML transferred: 751548 bytes Requests per second: 831.58 [#/sec] (mean)
Den Status des Memcache Daemons kann man wunderbar mit diesem View anzeigen lassen: http://effbot.org/zone/django-memcached-view.htm



