Use before_request to run code before every web request in Flask. It helps you add checks or setup without changing each route.
Before_request as middleware alternative in Flask
@app.before_request def function_name(): # code to run before each request
The function runs before every request automatically.
Return a response inside this function to stop the request from reaching routes.
@app.before_request def check_login(): if not session.get('user'): return redirect('/login')
@app.before_request def log_request(): print(f"Request from {request.remote_addr} at {datetime.now()}")
This Flask app uses before_request to print info and redirect users to login if not logged in. After login, users can access the home page.
from flask import Flask, request, redirect, session from datetime import datetime app = Flask(__name__) app.secret_key = 'secret' @app.before_request def before(): print(f"Before request: {request.path} at {datetime.now()}") if request.path != '/login' and not session.get('user'): return redirect('/login') @app.route('/login') def login(): session['user'] = 'guest' return 'Logged in! Go to /' @app.route('/') def home(): return 'Welcome to the home page!' if __name__ == '__main__': app.run(debug=True)
Use before_request for simple global checks or setup.
It runs before every request, so keep code fast to avoid slowing your app.
Returning a response inside before_request stops the request from reaching route handlers.
before_request runs code before every Flask request.
It is useful for login checks, logging, or setup tasks.
Returning a response here can redirect or block requests early.
Practice
before_request function in Flask?Solution
Step 1: Understand the role of
Thebefore_requestbefore_requestfunction 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 frombefore_request.Final Answer:
To run code before every request to perform tasks like login checks or logging -> Option DQuick Check:
before_request runs before requests = D [OK]
- Confusing before_request with error handlers
- Thinking before_request sends responses directly
- Mixing route definition with before_request
before_request function in Flask?Solution
Step 1: Recall Flask decorator syntax
Flask uses decorators like@app.before_requestabove 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 AQuick Check:
Use @app.before_request decorator = A [OK]
- Calling the function instead of decorating
- Assigning function instead of decorating
- Missing the @ symbol for decorator
/?
from flask import Flask, request, abort
app = Flask(__name__)
@app.before_request
def check_auth():
if request.args.get('token') != 'secret':
abort(401)
@app.route('/')
def home():
return 'Welcome!'
# Assume app runs normallySolution
Step 1: Understand the before_request check
Thecheck_authfunction runs before every request and aborts with 401 if the 'token' query parameter is not 'secret'.Step 2: Analyze the route behavior
If the token is correct, the request proceeds tohome()which returns 'Welcome!'. Otherwise, the request is stopped early with 401.Final Answer:
Displays 'Welcome!' if URL has ?token=secret, else 401 Unauthorized error -> Option AQuick Check:
before_request aborts if token wrong = C [OK]
- Thinking before_request must return a value
- Assuming route runs even if abort called
- Confusing query parameters with headers
before_request:
from flask import Flask
app = Flask(__name__)
@app.before_request
def setup():
print('Setup done')
@app.route('/')
def index():
return 'Hello'Solution
Step 1: Check before_request function requirements
Thebefore_requestfunction 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 CQuick Check:
before_request can have no return = B [OK]
- Expecting before_request to always return a response
- Confusing decorator syntax with function call
- Thinking route function must be named before_request
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?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 sessionwhich 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 BQuick Check:
Use @app.before_request and check 'user' in session = A [OK]
- Calling the function instead of decorating
- Checking session key with wrong condition
- Not returning redirect to stop request
Ready to prove it?
Pass the test and this pattern moves unknown
