def memoize(keyformat, time=60):
    """Decorator to memoize functions using memcache."""
    def decorator(fxn):
        def wrapper(*args, **kwargs):
            key = keyformat % args[0:keyformat.count('%')]
            data = memcache.get(key)
            if data is not None:
                return data
            data = fxn(*args, **kwargs)
            memcache.set(key, data, time)
            return data
        return wrapper
    return decorator if not Defaults.isDevelopmentServer() else fxn
def memoize2(time=120):
    """Decorator to memoize functions using memcache."""
    def decorator(fxn):
        def wrapper(*args, **kwargs):
            m = hashlib.md5()
            m.update(str(args))
            m.update(str(kwargs))
            key = m.hexdigest()
            data = memcache.get(key)
            if data is not None:
                logging.debug('key: "%s", hit' % key)
                return data
            logging.debug('key: "%s", miss' % key)
            data = fxn(*args, **kwargs)
            memcache.set(key, data, time)
            return data
        return wrapper
    return decorator if not Defaults.isDevelopmentServer() else fxn