Bird
Raised Fist0
Flaskframework~8 mins

Response caching strategies in Flask - Performance & Optimization

Choose your learning style10 modes available
Performance: Response caching strategies
HIGH IMPACT
Response caching affects how fast the server can deliver content and reduces load on the server and network, improving page load speed.
Serving frequently requested data in a Flask app
Flask
from flask import Flask, jsonify, make_response
import time
app = Flask(__name__)
cache = {}

@app.route('/data')
def data():
    if 'result' in cache and time.time() - cache['time'] < 60:
        response = make_response(jsonify(cache['result']))
        response.headers['Cache-Control'] = 'public, max-age=60'
        return response
    result = expensive_computation()
    cache['result'] = result
    cache['time'] = time.time()
    response = make_response(jsonify(result))
    response.headers['Cache-Control'] = 'public, max-age=60'
    return response
Caches the result in memory and sets HTTP cache headers to allow browsers and proxies to reuse the response for 60 seconds.
📈 Performance GainReduces server CPU load and response time by serving cached data; saves 200+ ms per repeated request
Serving frequently requested data in a Flask app
Flask
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/data')
def data():
    # No caching, recomputes every request
    result = expensive_computation()
    return jsonify(result)
Every request triggers the expensive computation and database calls, increasing server response time and CPU load.
📉 Performance CostBlocks rendering for 200+ ms per request, increases server CPU usage linearly with requests
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
No caching, recompute every requestN/A (server-side)N/AIncreases LCP due to slow response[X] Bad
Server-side caching with Cache-Control headersN/A (server-side)N/AFaster LCP due to quick response[OK] Good
Rendering Pipeline
When response caching is used, the server can quickly return cached content without recomputing data, reducing server processing time and network latency. The browser can also reuse cached responses, skipping network requests.
→Server Processing
→Network Transfer
→Browser Rendering
⚠️ BottleneckServer Processing time for generating dynamic content
Core Web Vital Affected
LCP
Response caching affects how fast the server can deliver content and reduces load on the server and network, improving page load speed.
Optimization Tips
1Cache expensive computations on the server to reduce response time.
2Use Cache-Control headers to enable browser and proxy caching.
3Set appropriate max-age values to balance freshness and performance.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main benefit of using server-side response caching in Flask?
ATriggers more DOM reflows in the browser
BReduces server processing time and speeds up response delivery
CIncreases the size of the HTML sent to the client
DDisables browser caching completely
DevTools: Network
How to check: Open DevTools, go to Network tab, reload the page, and inspect the response headers for Cache-Control and Age headers.
What to look for: Look for Cache-Control with max-age and Age header indicating cached response; faster response times indicate good caching.

Practice

(1/5)
1. What is the main purpose of response caching in a Flask application?
easy
A. To increase the size of the response data
B. To save server work and speed up response times
C. To make the server run slower intentionally
D. To disable user access temporarily

Solution

  1. Step 1: Understand response caching

    Response caching stores the output of a request so the server doesn't have to recompute it every time.
  2. Step 2: Identify the benefit

    This reduces server work and makes the app respond faster to repeated requests.
  3. Final Answer:

    To save server work and speed up response times -> Option B
  4. Quick Check:

    Response caching = save work & speed up [OK]
Hint: Caching speeds up responses by saving work [OK]
Common Mistakes:
  • Thinking caching increases response size
  • Believing caching slows down the server
  • Confusing caching with access control
2. Which of the following is the correct way to cache a Flask route response for 60 seconds using Flask-Caching?
easy
A. @cache.cache(60) def my_route(): return 'Hello'
B. @cache.cache(timeout=60) def my_route(): return 'Hello'
C. @cache.cached(timeout=60) def my_route(): return 'Hello'
D. @cached(60) def my_route(): return 'Hello'

Solution

  1. Step 1: Recall Flask-Caching decorator syntax

    The correct decorator is @cache.cached with a named argument timeout=60 to set cache duration.
  2. Step 2: Check each option

    @cache.cached(timeout=60) def my_route(): return 'Hello' uses correct decorator and syntax. Options A and B use cache.cache which is invalid. @cached(60) def my_route(): return 'Hello' misses the cache. instance prefix.
  3. Final Answer:

    @cache.cached(timeout=60) def my_route(): return 'Hello' -> Option C
  4. Quick Check:

    Use @cache.cached(timeout=seconds) [OK]
Hint: Use @cache.cached with timeout= seconds [OK]
Common Mistakes:
  • Using @cache.cache instead of @cache.cached
  • Omitting the cache. prefix (@cached instead of @cache.cached)
  • Using positional timeout argument
3. Given the code below, what will be printed on the second call to get_data() within 30 seconds?
@cache.cached(timeout=30)
def get_data():
    print('Fetching data...')
    return 'Data'
medium
A. Data
B. Fetching data...\nData
C. Fetching data...
D. Error: cache not found

Solution

  1. Step 1: Understand caching effect on function calls

    The first call runs the function, prints 'Fetching data...', and caches the return 'Data'.
  2. Step 2: Analyze second call within timeout

    Within 30 seconds, the cached result is returned directly, so the print statement does not run again.
  3. Final Answer:

    Data -> Option A
  4. Quick Check:

    Cached call skips print, returns cached 'Data' [OK]
Hint: Cached calls skip function body, return saved result [OK]
Common Mistakes:
  • Expecting print output on every call
  • Confusing cached return with function execution
  • Assuming cache misses cause errors
4. Identify the error in this Flask caching code snippet:
@cache.cached(timeout=60)
def index():
    return render_template('index.html')

# Later in code
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
medium
A. render_template cannot be cached
B. Timeout value must be a string, not integer
C. CACHE_TYPE 'simple' is invalid
D. Cache instance is created after using @cache.cached decorator

Solution

  1. Step 1: Check order of cache setup and usage

    The decorator @cache.cached uses the cache object, but it is created after the function definition, so cache is undefined at decoration time.
  2. Step 2: Validate other options

    Timeout as integer is valid. render_template output can be cached. 'simple' cache type is valid for development.
  3. Final Answer:

    Cache instance is created after using @cache.cached decorator -> Option D
  4. Quick Check:

    Define cache before using decorators [OK]
Hint: Create cache before decorating routes [OK]
Common Mistakes:
  • Defining cache after using it in decorators
  • Thinking timeout must be string
  • Believing templates can't be cached
5. You want to cache different responses for a Flask route based on the logged-in user ID. Which caching strategy should you use to ensure each user gets their own cached response?
hard
A. Use @cache.cached(timeout=60, key_prefix=lambda: f'user_{current_user.id}')
B. Use @cache.cached(timeout=60, key_prefix=lambda: request.args)
C. Use @cache.cached(timeout=60, key_prefix=lambda: request.path)
D. Use @cache.cached(timeout=60) without key_prefix

Solution

  1. Step 1: Understand caching by key prefix

    The cache stores responses by keys. To cache per user, the key must include the user ID.
  2. Step 2: Evaluate options for key prefix

    Use @cache.cached(timeout=60, key_prefix=lambda: f'user_{current_user.id}') uses a lambda returning a string with the current user's ID, ensuring unique cache per user. Use @cache.cached(timeout=60, key_prefix=lambda: request.path) uses request path only, same for all users. Use @cache.cached(timeout=60, key_prefix=lambda: request.args) uses request arguments, which may not include user ID. Use @cache.cached(timeout=60) without key_prefix uses default key, same for all users.
  3. Final Answer:

    Use @cache.cached(timeout=60, key_prefix=lambda: f'user_{current_user.id}') -> Option A
  4. Quick Check:

    Cache key must include user ID for per-user caching [OK]
Hint: Include user ID in cache key prefix [OK]
Common Mistakes:
  • Using only request path for cache key
  • Ignoring user-specific cache needs
  • Not using key_prefix for per-user caching
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard