Using before_request as Middleware Alternative in Flask
📖 Scenario: You are building a simple Flask web app that needs to check if a user is authenticated before allowing access to certain pages.Instead of writing the authentication check inside every route, you want to use Flask's before_request function as a middleware alternative to run this check automatically before each request.
🎯 Goal: Create a Flask app that uses before_request to check if a user is logged in before accessing the /dashboard route. If the user is not logged in, redirect them to the /login page.
📋 What You'll Learn
Create a Flask app instance named app
Define a global variable logged_in set to False initially
Use @app.before_request to create a function named check_login that checks if the user is logged in
If the user is not logged in and tries to access /dashboard, redirect to /login
Create two routes: /login and /dashboard that return simple text responses
💡 Why This Matters
🌍 Real World
Web apps often need to check user authentication before allowing access to certain pages. Using before_request as middleware helps keep the code clean and centralized.
💼 Career
Understanding middleware patterns and request lifecycle in Flask is essential for backend web development roles.
Progress0 / 4 steps
1
Set up Flask app and login status
Import Flask and redirect from flask. Create a Flask app instance called app. Create a global variable called logged_in and set it to False.
Flask
Hint
Use app = Flask(__name__) to create the app instance.
Set logged_in = False to represent the user not logged in yet.
2
Add before_request function to check login
Use the @app.before_request decorator to create a function named check_login. Inside it, check if logged_in is False and if the requested path is /dashboard. If both are true, return a redirect to /login.
Flask
Hint
Use @app.before_request to run check_login before every request.
Use request.path to get the current URL path.
3
Create /login and /dashboard routes
Create a route /login that returns the text 'Please log in.'. Create another route /dashboard that returns the text 'Welcome to your dashboard.'.
Flask
Hint
Use @app.route('/login') and @app.route('/dashboard') to define routes.
Return simple strings from each route function.
4
Add app run block for local testing
Add the standard Flask app run block: if __name__ == '__main__': and inside it call app.run(debug=True).
Flask
Hint
This block allows you to run the Flask app locally for testing.
Practice
(1/5)
1. What is the main purpose of the before_request function in Flask?
easy
A. To send the final response to the client
B. To handle errors after a request has been processed
C. To define routes and their handlers
D. To run code before every request to perform tasks like login checks or logging
Solution
Step 1: Understand the role of before_request
The before_request function runs before each request to the Flask app, allowing pre-processing like login checks or logging.
Step 2: Compare with other Flask functions
Functions like error handlers run after requests, and route handlers define endpoints, so they differ from before_request.
Final Answer:
To run code before every request to perform tasks like login checks or logging -> Option D
Quick Check:
before_request runs before requests = D [OK]
Hint: before_request runs code before requests start [OK]
Common Mistakes:
Confusing before_request with error handlers
Thinking before_request sends responses directly
Mixing route definition with before_request
2. Which of the following is the correct way to register a before_request function in Flask?
easy
A. @app.before_request\ndef my_function(): pass
B. app.before_request(my_function())
C. app.before_request = my_function()
D. app.before_request = my_function
Solution
Step 1: Recall Flask decorator syntax
Flask uses decorators like @app.before_request above a function to register it as a before_request handler.
Step 2: Analyze each option
@app.before_request\ndef my_function(): pass uses the correct decorator syntax. app.before_request(my_function()) calls the function instead of decorating. Options C and D assign incorrectly.
Final Answer:
@app.before_request\ndef my_function(): pass -> Option A
Quick Check:
Use @app.before_request decorator = A [OK]
Hint: Use @app.before_request decorator above the function [OK]
Common Mistakes:
Calling the function instead of decorating
Assigning function instead of decorating
Missing the @ symbol for decorator
3. Given this Flask code, what will be the output when accessing /?
A. Missing parentheses in @app.before_request decorator
B. No return statement in before_request function causes error
C. No error; code works correctly
D. Route function must be named before_request
Solution
Step 1: Check before_request function requirements
The before_request function can run code and does not need to return anything unless it wants to stop the request.
Step 2: Verify decorator and route correctness
The decorator syntax is correct, and the route function is properly defined with a return statement.
Final Answer:
No error; code works correctly -> Option C
Quick Check:
before_request can have no return = B [OK]
Hint: before_request functions don't need to return unless blocking [OK]
Common Mistakes:
Expecting before_request to always return a response
Confusing decorator syntax with function call
Thinking route function must be named before_request
5. You want to use before_request to check if a user is logged in by verifying a session key. If not logged in, redirect to /login. Which code snippet correctly implements this?
hard
A. from flask import redirect, session
def check_login():
if 'user' not in session:
return redirect('/login')
app.before_request(check_login())
B. from flask import redirect, session
@app.before_request
def check_login():
if 'user' not in session:
return redirect('/login')
C. from flask import redirect, session
@app.before_request
def check_login():
if session['user'] is None:
return redirect('/login')
D. from flask import redirect
@app.before_request
def check_login():
if session.get('user') == False:
return redirect('/login')
Solution
Step 1: Check session key existence safely
from flask import redirect, session
@app.before_request
def check_login():
if 'user' not in session:
return redirect('/login') uses 'user' not in session which safely checks if the user is logged in.
Step 2: Confirm correct decorator and redirect usage
from flask import redirect, session
@app.before_request
def check_login():
if 'user' not in session:
return redirect('/login') uses the @app.before_request decorator and returns a redirect response correctly to stop further processing.
Final Answer:
from flask import redirect, session
@app.before_request
def check_login():
if 'user' not in session:
return redirect('/login') -> Option B
Quick Check:
Use @app.before_request and check 'user' in session = A [OK]
Hint: Use @app.before_request and check session key presence [OK]
Common Mistakes:
Calling the function instead of decorating
Checking session key with wrong condition
Not returning redirect to stop request
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.