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