📖 Scenario: You are building a simple Flask web app that needs to check if a user is logged in before allowing access to certain pages.To do this, you will use a before_request hook to run a function before every request. This function will check a variable to decide if the user is logged in.
🎯 Goal: Create a Flask app that uses a before_request hook to check a login status before serving pages.If the user is not logged in, the app should redirect them to a login page.
📋 What You'll Learn
Create a Flask app instance
Define a global variable logged_in set to False
Use @app.before_request to define a function that checks logged_in
Redirect to /login if logged_in is False
Create two routes: / for the home page and /login for the login page
💡 Why This Matters
🌍 Real World
Before_request hooks are used in web apps to run code before every page loads, such as checking if a user is logged in or setting up data.
💼 Career
Understanding before_request hooks is important for backend web developers to control access and prepare requests in Flask applications.
Progress0 / 4 steps
1
Create the Flask app and login status variable
Import Flask and create an app instance called app. Then create a variable called logged_in and set it to False.
Flask
Hint
Use app = Flask(__name__) to create the app.
Set logged_in = False as a global variable.
2
Add the before_request hook to check login
Use the @app.before_request decorator to create a function called check_login. Inside it, check if logged_in is False. If so, import and use redirect and request from Flask to redirect to /login unless the current path is already /login.
Flask
Hint
Use @app.before_request above the function.
Inside the function, check if not logged_in and request.path != '/login'.
Return redirect('/login') in that case.
3
Create the home page route
Create a route for / using @app.route('/'). Define a function called home that returns the string 'Welcome to the home page!'.
Flask
Hint
Use @app.route('/') to create the home page route.
Return the welcome string from the home function.
4
Create the login page route
Create a route for /login using @app.route('/login'). Define a function called login that returns the string 'Please log in.'.
Flask
Hint
Use @app.route('/login') to create the login page route.
Return the login prompt string from the login function.
Practice
(1/5)
1. What is the main purpose of a before_request hook in Flask?
easy
A. To run code before every request to prepare or check something
B. To define the main route of the application
C. To handle errors after a request is processed
D. To send the final response to the client
Solution
Step 1: Understand the role of before_request
The before_request hook runs before each request to prepare data or check conditions.
Step 2: Compare with other options
Defining routes, handling errors, or sending responses happen elsewhere, not in before_request.
Final Answer:
To run code before every request to prepare or check something -> Option A
Quick Check:
before_request runs before request = C [OK]
Hint: before_request runs code before each request [OK]
Common Mistakes:
Confusing before_request with route handlers
Thinking it handles errors or sends responses
Assuming it runs after the request
2. Which of the following is the correct way to register a before_request hook in Flask that does not short-circuit the request?
easy
A. @app.before_request\nclass BeforeHook: pass
B. @app.before_request()\ndef before(): pass
C. @app.before_request\ndef before(): return 'Hello'
D. @app.before_request\ndef before(): pass
Solution
Step 1: Recall the decorator syntax
The before_request decorator is used without parentheses: @app.before_request.
Step 2: Check function definition
The hook must be a function, not a class, and must not return a response to continue to the route.
Final Answer:
@app.before_request\ndef before(): pass -> Option D
Quick Check:
Decorator without () and function = D [OK]
Hint: Use @app.before_request without parentheses [OK]
Common Mistakes:
Adding parentheses after @app.before_request
Defining a class instead of a function
Returning a value when not needed
3. Given this Flask code, what will be the output when accessing /?
D. Returning None in before_request causes an error
Solution
Step 1: Understand return behavior in before_request
Returning None means no response is sent, so Flask continues to route handler.
Step 2: Check if printing is allowed
Printing is allowed and useful for debugging; it does not cause errors.
Final Answer:
Nothing is wrong; code works fine -> Option B
Quick Check:
None return means continue normal route = A [OK]
Hint: Return None or nothing to continue request normally [OK]
Common Mistakes:
Thinking return None causes error
Believing before_request must always return response
Assuming print statements break Flask hooks
5. You want to use a before_request hook to block access to all routes except /login unless a user is logged in. Which code snippet correctly implements this?
hard
A. from flask import request, redirect, session
@app.before_request
def block():
if request.path != '/login' and not session.get('user'):
return redirect('/login')
B. from flask import request, redirect
@app.before_request
def block():
if request.path == '/login':
return redirect('/login')
C. from flask import session
@app.before_request
def block():
if not session.get('user'):
return 'Access Denied'
D. from flask import request
@app.before_request
def block():
if request.path == '/login' or session.get('user'):
return redirect('/login')
Solution
Step 1: Identify the condition to block access
We want to redirect to /login if the path is not /login and user is not logged in.
Step 2: Check each option logic
from flask import request, redirect, session
@app.before_request
def block():
if request.path != '/login' and not session.get('user'):
return redirect('/login') correctly checks path and session, redirecting only when needed. Others either redirect wrongly or deny access without redirect.
Final Answer:
from flask import request, redirect, session
@app.before_request
def block():
if request.path != '/login' and not session.get('user'):
return redirect('/login') -> Option A
Quick Check:
Check path and session, redirect if not logged in = A [OK]
Hint: Check path and session, redirect if not logged in [OK]
Common Mistakes:
Redirecting /login to itself causing loop
Not checking path before redirect
Returning string instead of redirect response
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.