Flask-Caching

2.3.1 · active · verified Thu Apr 09

Flask-Caching adds comprehensive caching support to Flask applications, providing various backend options such as SimpleCache, RedisCache, MemcachedCache, FileSystemCache, and others. It integrates seamlessly with Flask applications to cache view functions or parts of templates. The current version is 2.3.1, and the library maintains an active release cadence with regular updates and patches.

Warnings

Install

Imports

Quickstart

This quickstart demonstrates setting up Flask-Caching with a `SimpleCache` backend, caching a simple view function (`/`), and using a custom `make_cache_key` for a dynamic route (`/user/<username>`). It also includes an endpoint to clear the cache. For external backends like Redis or Memcached, ensure the respective `CACHE_TYPE` and configuration variables are set in `app.config` and the necessary dependencies are installed (e.g., `pip install Flask-Caching[redis]` and `pip install redis`).

from flask import Flask, request
from flask_caching import Cache
import datetime

app = Flask(__name__)

# Example Configuration (using SimpleCache, good for development)
# For production, consider 'RedisCache', 'MemcachedCache', etc.
app.config.from_mapping({
    "CACHE_TYPE": "SimpleCache", # Type of cache to use (e.g., SimpleCache, RedisCache, MemcachedCache)
    "CACHE_DEFAULT_TIMEOUT": 300 # Default timeout in seconds for cached items
    # For RedisCache: "CACHE_REDIS_HOST": "localhost", "CACHE_REDIS_PORT": 6379
})

cache = Cache(app)

@app.route("/")
@cache.cached(timeout=60) # Cache this view for 60 seconds
def index():
    # This part will only execute once every 60 seconds
    current_time = datetime.datetime.now().strftime("%H:%M:%S")
    return f"<h1>Hello, Flask-Caching!</h1><p>The time is: {current_time}</p><p>This page is cached.</p>"

@app.route("/reset_cache")
def reset_cache():
    cache.clear()
    return "Cache cleared!"

# Example with dynamic URL and custom cache key
@app.route("/user/<username>")
@cache.cached(timeout=30, make_cache_key=lambda: request.path)
def user_profile(username):
    # Simulate a database lookup
    import time
    time.sleep(2) 
    return f"<h2>Profile for {username}</h2><p>Data fetched at {datetime.datetime.now().strftime("%H:%M:%S")}</p>"

if __name__ == '__main__':
    app.run(debug=True)

view raw JSON →