📖 Scenario: You are building a simple Flask web app that shows the current time. To make the app faster and reduce server load, you want to add caching strategies to store and reuse responses for a short time.
🎯 Goal: Build a Flask app with a route /time that returns the current time. Add a caching mechanism that stores the response for 10 seconds so repeated requests within that time return the cached response instead of recalculating the time.
📋 What You'll Learn
Create a Flask app with a route /time
Add a cache dictionary to store cached responses
Set a cache timeout of 10 seconds
Implement logic to return cached response if valid
Return fresh response and update cache if expired
💡 Why This Matters
🌍 Real World
Caching responses in web apps improves speed and reduces server load by reusing data instead of recalculating it every time.
💼 Career
Understanding caching strategies is important for backend developers to optimize web app performance and scalability.
Progress0 / 4 steps
1
Set up Flask app and route
Import Flask and datetime. Create a Flask app called app. Define a route /time with a function get_time that returns the current time as a string using datetime.datetime.now().
Flask
Hint
Use datetime.now().strftime('%Y-%m-%d %H:%M:%S') to format the current time as a string.
2
Add cache dictionary and timeout
Create a dictionary called cache to store cached responses. Create a variable cache_timeout and set it to 10 seconds.
Flask
Hint
Use a simple dictionary cache = {} and set cache_timeout = 10.
3
Implement caching logic in route
Inside get_time, import time. Check if 'time' key exists in cache and if the cached timestamp is within cache_timeout. If valid, return the cached response. Otherwise, get the current time string, store it in cache['time'] with the current timestamp, and return it.
Flask
Hint
Use time.time() to get current timestamp. Store tuple of (response, timestamp) in cache.
4
Add app run block
Add the block if __name__ == '__main__': and inside it call app.run(debug=True) to run the Flask app in debug mode.
Flask
Hint
This block runs the Flask app when you run the script directly.
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
Step 1: Understand response caching
Response caching stores the output of a request so the server doesn't have to recompute it every time.
Step 2: Identify the benefit
This reduces server work and makes the app respond faster to repeated requests.
Final Answer:
To save server work and speed up response times -> Option B
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
Step 1: Recall Flask-Caching decorator syntax
The correct decorator is @cache.cached with a named argument timeout=60 to set cache duration.
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.
Final Answer:
@cache.cached(timeout=60)
def my_route():
return 'Hello' -> Option C
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?
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
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.
Step 2: Validate other options
Timeout as integer is valid. render_template output can be cached. 'simple' cache type is valid for development.
Final Answer:
Cache instance is created after using @cache.cached decorator -> Option D
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
Step 1: Understand caching by key prefix
The cache stores responses by keys. To cache per user, the key must include the user ID.
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.
Final Answer:
Use @cache.cached(timeout=60, key_prefix=lambda: f'user_{current_user.id}') -> Option A
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 unknownstrongwhile earning +1 Grip toward your certificate.