How to use Flask-Cache with Flask-Restful How to use Flask-Cache with Flask-Restful python python

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 your cache.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)