Source code for dq.cache
import json
from functools import wraps
from dq.redis import init_redis, strval
_redis = init_redis('cache')
[docs]def cache(ttl=600, key_func=None):
"""Cache decorator.
This can be applied to any function that returns a raw or JSON-serializable
response. To allow caching, the ``cache`` key must be set in the config,
namely the redis connection for cache.
If the function has a keyword argument named ``fresh``, then the decorator
gets a fresh copy when it's set to a truthy value.
If the function has a keyword argument named ``raw``, then the decorator
returns the raw (bytes) Redis response as-is, without JSON-deserializing.
:param number ttl: The TTL in second. Default is 10 minutes.
:param func key_func: The key function. This function should take the same
arguments as the wrapped function, and return the corresponding cache
key as a string.
"""
def memoize(func):
@wraps(func)
def decorated_func(*args, **kwargs):
if not _redis or not key_func:
return func(*args, **kwargs)
key = key_func(*args, **kwargs)
if not kwargs.get('fresh'):
resp = _redis.get(key)
if resp is not None:
return resp if kwargs.get('raw') else json.loads(resp)
resp = func(*args, **kwargs)
_redis.setex(key, ttl, strval(resp))
return resp
return decorated_func
return memoize