How to use Flask-Cache with Flask-Restful
As Flask-Cache
implementation doesn't give you access to the underlying cache
object, you'll have to explicitly instantiate a Redis
client and use it's keys
method (list all cache keys).
- The
cache_key
method is used to override the default key generation in yourcache.cached
decorator. - The
clear_cache
method will clear only the portion of the cache corresponding to the current resource.
This is a solution that was tested only for Redis
and the implementation will probably differ a little when using a different cache engine.
from app import cache # The Flask-Cache objectfrom config import CACHE_REDIS_HOST, CACHE_REDIS_PORT # The Flask-Cache configfrom redis import Redisfrom flask import requestimport urllibredis_client = Redis(CACHE_REDIS_HOST, CACHE_REDIS_PORT)def cache_key(): args = request.args key = request.path + '?' + urllib.urlencode([ (k, v) for k in sorted(args) for v in sorted(args.getlist(k)) ]) return key@api.resource('/whatever')class Foo(Resource): @cache.cached(timeout=10, key_prefix=cache_key) def get(self): return expensive_db_operation() def post(self): update_db_here() self.clear_cache() return something_useful() def clear_cache(self): # Note: we have to use the Redis client to delete key by prefix, # so we can't use the 'cache' Flask extension for this one. key_prefix = request.path keys = [key for key in redis_client.keys() if key.startswith(key_prefix)] nkeys = len(keys) for key in keys: redis_client.delete(key) if nkeys > 0: log.info("Cleared %s cache keys" % nkeys) log.info(keys)
Yes, you can use like that.
Maybe you will still need to read: flask-cache memoize URL query string parameters as well
You can invalidate cache using cache.clear()
method.
For more detials see: https://pythonhosted.org/Flask-Cache/#flask.ext.cache.Cache.clear and Clearing Cache section in https://pythonhosted.org/Flask-Cache/