def cache(cls_object, args_name): def cache_decorator(fun): @wraps(fun) def decorated(*args, **kwargs): cache = CacheFactory.get_cache() self = args[0] key = get_key_from_args(fun.__name__, *args[1:], **kwargs) obj = cache.get(key) if obj: obj = self.session.merge(obj, load=False) else: obj = fun(*args, **kwargs) cache.set(key, obj) return obj @event.listens_for(cls_object, 'after_update') def invalidate(mapper, connection, target): cache = CacheFactory.get_cache() args = [getattr(target, arg) for arg in args_name] key = get_key_from_args(fun.__name__, *args) cache.delete(key) return decorated return cache_decorator