📖 Scenario: You are building a simple Flask web app that serves a greeting message. To protect your app from too many requests in a short time, you want to add rate limiting.This means users can only access the greeting a limited number of times per minute.
🎯 Goal: Build a Flask app with a single route /hello that returns a greeting message. Use Flask-Limiter to limit requests to 3 per minute per user IP.
📋 What You'll Learn
Create a Flask app instance named app
Set up Flask-Limiter with default limit of 3 requests per minute
Create a route /hello that returns 'Hello, world!'
Apply the rate limit to the /hello route
💡 Why This Matters
🌍 Real World
Rate limiting protects web apps from too many requests that can overload the server or cause abuse.
💼 Career
Understanding Flask-Limiter is useful for backend developers building secure and reliable Flask web applications.
Progress0 / 4 steps
1
Create the Flask app instance
Write code to import Flask from flask and create a Flask app instance called app.
Flask
Hint
Use Flask(__name__) to create the app.
2
Set up Flask-Limiter with default limit
Import Limiter from flask_limiter and get_remote_address from flask_limiter.util. Create a Limiter instance named limiter with the app, key_func=get_remote_address, and set the default limit to 3 per minute using default_limits=["3 per minute"] to limit by user IP.
Flask
Hint
Use get_remote_address from flask_limiter.util for the IP key function.
3
Create the /hello route with rate limiting
Define a route /hello using @app.route('/hello'). Define a function hello() that returns the string 'Hello, world!'. Apply the rate limit decorator @limiter.limit('3 per minute') to this function.
Flask
Hint
Use both @app.route and @limiter.limit decorators above the function.
4
Add the app run block
Add the standard Flask app run block: if __name__ == '__main__': and inside it call app.run(debug=True) to start the server 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 using Flask-Limiter in a Flask application?
easy
A. To limit how many requests a user can make in a given time
B. To speed up the Flask application by caching responses
C. To automatically generate API documentation
D. To handle database migrations smoothly
Solution
Step 1: Understand Flask-Limiter's role
Flask-Limiter is designed to control the number of requests a user can make to prevent abuse.
Step 2: Compare options with Flask-Limiter's purpose
Options A, B, and D relate to documentation, caching, and migrations, which are unrelated to rate limiting.
Final Answer:
To limit how many requests a user can make in a given time -> Option A
Quick Check:
Flask-Limiter = request limiting [OK]
Hint: Flask-Limiter controls request frequency to protect your app [OK]
Common Mistakes:
Confusing Flask-Limiter with caching tools
Thinking it manages database or docs
Assuming it speeds up the app
2. Which of the following is the correct way to apply a rate limit of 5 requests per minute to a Flask route using Flask-Limiter?
easy
A. @limiter.limit('minute/5')\ndef my_route():\n return 'Hello'
B. @limiter.limit(5)\ndef my_route():\n return 'Hello'
C. @limiter.limit('5 requests')\ndef my_route():\n return 'Hello'
D. @limiter.limit('5/minute')\ndef my_route():\n return 'Hello'
Solution
Step 1: Check the syntax for rate limit string
The correct format is a string like '5/minute' specifying count and time unit.
Step 2: Validate each option's syntax
@limiter.limit('5/minute')\ndef my_route():\n return 'Hello' uses '5/minute' which is correct. Options B, C, and D use incorrect formats or missing quotes.
Final Answer:
@limiter.limit('5/minute')\ndef my_route():\n return 'Hello' -> Option D
Quick Check:
Correct limit string format = @limiter.limit('5/minute')\ndef my_route():\n return 'Hello' [OK]
Hint: Use string 'count/unit' like '5/minute' in @limiter.limit [OK]
Common Mistakes:
Omitting quotes around the limit string
Using numbers without units
Incorrect time unit format
3. Given this Flask app snippet using Flask-Limiter:
from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
app = Flask(__name__)
limiter = Limiter(app, key_func=get_remote_address)
@app.route('/')
@limiter.limit('2/minute')
def home():
return 'Welcome!'
# Assume the same client makes 3 quick requests
What will happen on the third request from the same client within one minute?
medium
A. The third request will be blocked with a 429 Too Many Requests error
B. The third request will succeed and return 'Welcome!'
C. The app will crash with an exception
D. The third request will be delayed but eventually succeed
Solution
Step 1: Understand the limit set
The route is limited to 2 requests per minute per client IP.
Step 2: Analyze the third request behavior
The third request exceeds the limit, so Flask-Limiter blocks it with a 429 error.
Final Answer:
The third request will be blocked with a 429 Too Many Requests error -> Option A
Quick Check:
Requests > limit = 429 error [OK]
Hint: Requests over limit get 429 error response [OK]
Common Mistakes:
Thinking extra requests succeed silently
Assuming app crashes on limit exceed
Believing requests get delayed instead of blocked
4. Consider this Flask app code snippet using Flask-Limiter:
from flask import Flask
from flask_limiter import Limiter
app = Flask(__name__)
limiter = Limiter(app)
@app.route('/test')
@limiter.limit('3/minute')
def test():
return 'Test'
When running this code, the rate limiting does not work as expected. What is the most likely cause?
medium
A. The limit string '3/minute' is invalid syntax
B. The decorator @limiter.limit must be placed before @app.route
C. Missing key_func argument to identify clients, so all requests share the same limit
D. Flask-Limiter requires Flask app to be created after Limiter
Solution
Step 1: Check Limiter initialization
Limiter is created without a key_func, so it uses default which may not distinguish clients properly.
Step 2: Understand key_func role
Without key_func like get_remote_address, all requests share the same limit, causing unexpected behavior.
Final Answer:
Missing key_func argument to identify clients, so all requests share the same limit -> Option C
Quick Check:
key_func missing = shared limit problem [OK]
Hint: Always set key_func to identify clients for correct limits [OK]
Common Mistakes:
Assuming limit string syntax is wrong
Thinking decorator order matters here
Believing app creation order affects Limiter
5. You want to apply a global rate limit of 10 requests per minute for all routes but allow a specific route /special to have a higher limit of 30 requests per minute using Flask-Limiter. Which code snippet correctly implements this?