--- /dev/null
+#!/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)
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)