Flask uses contexts to keep track of data during a request or application run. This helps Flask know what data belongs to which user or task without mixing them up.
Context lifecycle execution in Flask
from flask import Flask, request, g app = Flask(__name__) @app.before_request def before(): # Code to run before each request g.user = 'Guest' @app.route('/') def index(): return f"Hello, {g.user}!" @app.teardown_request def teardown(exception=None): # Code to run after each request pass
@app.before_request runs code before each request starts.
@app.teardown_request runs code after each request ends, even if there was an error.
g.user inside your routes.from flask import Flask, g app = Flask(__name__) @app.before_request def set_user(): g.user = 'Alice'
from flask import Flask, request app = Flask(__name__) @app.before_request def check_auth(): if not request.headers.get('Authorization'): return 'Unauthorized', 401
from flask import Flask app = Flask(__name__) @app.teardown_request def close_db(error=None): print('Request finished, closing resources')
This Flask app sets a user name from the URL query parameter before each request. The route greets the user by name or says 'Guest' if no name is given. After the request, it prints a message in the console.
from flask import Flask, g, request app = Flask(__name__) @app.before_request def before(): g.user = request.args.get('user', 'Guest') @app.route('/') def index(): return f"Hello, {g.user}!" @app.teardown_request def teardown(exception=None): print('Request ended') if __name__ == '__main__': app.run(debug=True)
The g object is a place to store data during a request. It resets for each new request.
Contexts help Flask know which request is running, so data doesn't get mixed between users.
Use before_request to prepare data and teardown_request to clean up.
Flask uses context lifecycle hooks to run code before and after each request.
This helps manage data and resources safely during web requests.
Use g to store request-specific data accessible in your routes.
Practice
before_request function in the context lifecycle?Solution
Step 1: Understand the role of
This function runs before each request to set up anything needed during the request.before_requestStep 2: Compare with other lifecycle hooks
after_requestcleans up after requests, error handlers manage errors, and routes define URLs.Final Answer:
To run code before each request to prepare data or resources -> Option AQuick Check:
before_requestruns before request [OK]
- Confusing before_request with after_request
- Thinking before_request handles errors
- Mixing route definitions with lifecycle hooks
Solution
Step 1: Identify how Flask manages request-specific data
Flask provides thegobject to store data unique to each request.Step 2: Confirm correct usage
Usingginsidebefore_requestensures data is set up before route handlers run.Final Answer:
Store data in thegobject inside abefore_requestfunction -> Option AQuick Check:
gstores request data [OK]
g for request data, not globals [OK]- Using global variables that persist across requests
- Trying to store request data in app class variables
- Modifying the response object directly for data storage
/hello?
from flask import Flask, g
app = Flask(__name__)
@app.before_request
def before():
g.message = 'Hi'
@app.route('/hello')
def hello():
return g.message + ' there!'Solution
Step 1: Analyze the
The function setsbefore_requestfunctiong.messageto 'Hi' before the route runs.Step 2: Check the route handler output
The route returnsg.message + ' there!', which becomes 'Hi there!'.Final Answer:
Hi there! -> Option CQuick Check:
g.messageset before route [OK]
g data used in routes [OK]- Assuming
g.messageis not set yet - Forgetting
before_requestruns before routes - Expecting an error due to missing
gattribute
g outside a request context?
from flask import Flask, g
app = Flask(__name__)
g.message = 'Hello'
@app.route('/')
def index():
return g.messageSolution
Step 1: Identify where
gis assignedg.message = 'Hello'is set outside any request or app context.Step 2: Understand Flask context rules
gis only available during a request context; accessing it outside causes an error.Final Answer:
Accessinggoutside a request causes a runtime error -> Option DQuick Check:
gonly valid inside requests [OK]
g only inside request functions [OK]- Setting
gvariables globally outside requests - Confusing
gwith global variables - Ignoring Flask's context lifecycle rules
Solution
Step 1: Use
Store the current time inbefore_requestto mark start timeg.start_timebefore the request runs.Step 2: Use
Calculate elapsed time using current time minusafter_requestto calculate duration and logg.start_timeand log it, then return the response.Final Answer:
Usebefore_requestto store start time ing, andafter_requestto calculate and log duration -> Option BQuick Check:
Use before_request and after_request for timing [OK]
- Using global variables instead of
g - Logging time only inside routes missing full request duration
- Mixing up lifecycle hook order
Ready to prove it?
Pass the test and this pattern moves unknown
