Bird
Raised Fist0
Flaskframework~10 mins

Before_request as middleware alternative in Flask - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Before_request as middleware alternative
Client sends HTTP request
↓
Flask app receives request
↓
@before_request function runs
↓
Continue to route
↓
Route handler runs
↓
Response sent back to client
This flow shows how Flask runs a function before each request to act like middleware, deciding to continue or return early.
Execution Sample
Flask
from flask import Flask, request
app = Flask(__name__)

@app.before_request
def check_auth():
    if request.headers.get('X-Auth') is None:
        return 'Unauthorized', 401
This code runs check_auth before every request to block unauthorized access if header missing.
Execution Table
StepActionRequest Headersbefore_request ResultRoute Handler CalledResponse Sent
1Request received with headers {'X-Auth': 'token123'}{'X-Auth': 'token123'}None (continue)YesRoute response
2Request received with headers {}{}'Unauthorized', 401 (stop)No'Unauthorized', 401
3Request received with headers {'X-Auth': ''}{'X-Auth': ''}None (continue)YesRoute response
💡 Execution stops early if before_request returns a response, otherwise route handler runs.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3
request.headers{}{'X-Auth': 'token123'}{}{'X-Auth': ''}
before_request returnNoneNone'Unauthorized', 401None
route_handler_calledFalseTrueFalseTrue
response_sentNoneRoute response'Unauthorized', 401Route response
Key Moments - 2 Insights
Why does the route handler not run when before_request returns a response?
Because returning a response from before_request stops further processing, as shown in execution_table row 2 where route_handler_called is No.
What happens if before_request returns None?
Returning None means continue processing normally, so the route handler runs, as seen in rows 1 and 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the before_request return value at step 2?
A'OK', 200
BNone
C'Unauthorized', 401
DRaises error
💡 Hint
Check the 'before_request Result' column at step 2 in the execution_table.
At which step does the route handler NOT get called?
AStep 2
BStep 1
CStep 3
DAll steps call route handler
💡 Hint
Look at the 'Route Handler Called' column in the execution_table.
If the request headers always include 'X-Auth', how would the response_sent column change?
AIt would always be 'Unauthorized', 401
BIt would always be 'Route response'
CIt would alternate between 'Unauthorized' and 'Route response'
DIt would be empty
💡 Hint
Refer to variable_tracker for response_sent values when 'X-Auth' header is present.
Concept Snapshot
Flask @before_request runs a function before each request.
If it returns a response, request stops and response is sent early.
If it returns None, request continues to route handler.
Use it like middleware to check auth or modify requests.
Helps centralize pre-route logic in one place.
Full Transcript
In Flask, the @before_request decorator lets you run a function before every request. This function can check things like authentication headers. If it returns a response, Flask sends that response immediately and skips the route handler. If it returns None, Flask continues to the route handler as usual. This acts like middleware, letting you centralize checks or setup before routes run. For example, checking for an 'X-Auth' header and returning 'Unauthorized' if missing stops the request early. Otherwise, the route runs normally. This flow helps keep your app organized and secure.

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

  1. 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.
  2. 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.
  3. Final Answer:

    To run code before every request to perform tasks like login checks or logging -> Option D
  4. 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

  1. Step 1: Recall Flask decorator syntax

    Flask uses decorators like @app.before_request above a function to register it as a before_request handler.
  2. 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.
  3. Final Answer:

    @app.before_request\ndef my_function(): pass -> Option A
  4. 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 /?
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 normally
medium
A. Displays 'Welcome!' if URL has ?token=secret, else 401 Unauthorized error
B. Always displays 'Welcome!' regardless of token
C. Always returns 401 Unauthorized error
D. Raises a syntax error due to missing return in before_request

Solution

  1. Step 1: Understand the before_request check

    The check_auth function runs before every request and aborts with 401 if the 'token' query parameter is not 'secret'.
  2. Step 2: Analyze the route behavior

    If the token is correct, the request proceeds to home() which returns 'Welcome!'. Otherwise, the request is stopped early with 401.
  3. Final Answer:

    Displays 'Welcome!' if URL has ?token=secret, else 401 Unauthorized error -> Option A
  4. Quick Check:

    before_request aborts if token wrong = C [OK]
Hint: before_request can block requests early with abort() [OK]
Common Mistakes:
  • Thinking before_request must return a value
  • Assuming route runs even if abort called
  • Confusing query parameters with headers
4. Identify the error in this Flask code using before_request:
from flask import Flask
app = Flask(__name__)

@app.before_request
def setup():
    print('Setup done')

@app.route('/')
def index():
    return 'Hello'
medium
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

  1. 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.
  2. Step 2: Verify decorator and route correctness

    The decorator syntax is correct, and the route function is properly defined with a return statement.
  3. Final Answer:

    No error; code works correctly -> Option C
  4. 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

  1. 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.
  2. 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.
  3. Final Answer:

    from flask import redirect, session @app.before_request def check_login(): if 'user' not in session: return redirect('/login') -> Option B
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard