From b32504655f8b86d1278cd1583bea73bdccfff4b8 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 17 Dec 2010 02:21:59 +0100 Subject: [PATCH] Add support for memcached. --- www/webapp/backend/__init__.py | 1 + www/webapp/backend/memcached.py | 21 +++++++++++++++++++++ www/webapp/handlers_base.py | 4 ++++ www/webapp/handlers_iuse.py | 29 ++++++++++++++++++----------- 4 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 www/webapp/backend/memcached.py diff --git a/www/webapp/backend/__init__.py b/www/webapp/backend/__init__.py index 390783e6..83ecfec1 100644 --- a/www/webapp/backend/__init__.py +++ b/www/webapp/backend/__init__.py @@ -4,6 +4,7 @@ from accounts import Accounts from banners import Banners from geoip import GeoIP from iuse import IUse +from memcached import Memcached from menu import Menu from mirrors import Mirrors from netboot import NetBoot diff --git a/www/webapp/backend/memcached.py b/www/webapp/backend/memcached.py new file mode 100644 index 00000000..bf293d52 --- /dev/null +++ b/www/webapp/backend/memcached.py @@ -0,0 +1,21 @@ +#!/usr/bin/python + +import memcache + +from misc import Singleton +from settings import Settings + +class Memcached(object): + __metaclass__ = Singleton + + def __init__(self): + # Fetch hosts from database + hosts = Settings().get("memcached_servers").split(",") + + self._connection = memcache.Client(hosts, debug=0) + + def get(self, *args, **kwargs): + return self._connection.get(*args, **kwargs) + + def set(self, *args, **kwargs): + return self._connection.set(*args, **kwargs) diff --git a/www/webapp/handlers_base.py b/www/webapp/handlers_base.py index 21ded7e4..602b9fef 100644 --- a/www/webapp/handlers_base.py +++ b/www/webapp/handlers_base.py @@ -68,6 +68,10 @@ class BaseHandler(tornado.web.RequestHandler): def banners(self): return backend.Banners() + @property + def memcached(self): + return backend.Memcached() + @property def mirrors(self): return backend.Mirrors() diff --git a/www/webapp/handlers_iuse.py b/www/webapp/handlers_iuse.py index 97f5fac9..b7a66f29 100644 --- a/www/webapp/handlers_iuse.py +++ b/www/webapp/handlers_iuse.py @@ -15,19 +15,26 @@ class IUseImage(BaseHandler): return backend.Stasy() def get(self, profile_id, image_id): - image_cls = self.iuse.get_imagetype(image_id) - if not image_cls: - raise tornado.web.HTTPError(404, "Image class is unknown: %s" % image_id) + # Try to get the image from memcache. If we have a cache miss we + # build a new one. + mem_id = "iuse-%s-%s" % (profile_id, image_id) + image = self.memcached.get(mem_id) - profile = self.stasy.get_profile(profile_id) - if not profile: - raise tornado.web.HTTPError(404, "Profile '%s' was not found." % profile_id) + if not image: + image_cls = self.iuse.get_imagetype(image_id) + if not image_cls: + raise tornado.web.HTTPError(404, "Image class is unknown: %s" % image_id) - self.set_header("Content-type", "image/png") + profile = self.stasy.get_profile(profile_id) + if not profile: + raise tornado.web.HTTPError(404, "Profile '%s' was not found." % profile_id) + + # Render the image + image = image_cls(profile).to_string() - # Render the image - # XXX use memcached at this place - image = image_cls(profile) + # Save the image to the memcache for 15 minutes + self.memcached.set(mem_id, image, 15*60) - self.write(image.to_string()) + self.set_header("Content-type", "image/png") + self.write(image) -- 2.47.3