When learning Flask, “context” is a core concept that you can’t avoid. In simple terms, context is the state and data collection of the current environment. For example, when you visit a web page, the browser sends your request information (such as URL, method, parameters) to the server, and the server processes it and returns a response. During this process, temporary storage of this information is needed, which is where the context comes into play.
Flask designs two mechanisms, request context and application context, to make it easy for developers to access request and application-related data. They are like two different “toolboxes” that store data related to a single request and the entire application, respectively.
一、为什么需要上下文?¶
Suppose you are writing a blog system. When a user accesses the /login page, you need to:
- Get the username and password submitted by the user (this is data brought by the request, requiring request context)
- Read the application’s configuration file (such as database connection information, which is application-related data, requiring application context)
- Share temporary data between different functions in the same request (such as user login status, requiring temporary storage)
Without context, how would these data be passed between functions? Context solves this problem—it automatically helps you “remember” the current request and application state, so you don’t need to manually pass parameters.
二、请求上下文(Request Context)¶
定义¶
Request context is a single request’s exclusive “environment”, created when a user initiates a request and destroyed after the server returns a response.
核心变量¶
request:Points to the current request object, containing all request information (URL, HTTP method, parameters, cookies, etc.).
from flask import request
@app.route('/login')
def login():
username = request.form.get('username') # 获取请求表单中的用户名
password = request.form.get('password')
return f"User {username} is trying to log in"
g:The “temporary data container” for the request context, used to share data between different functions in a single request.
from flask import g
@app.route('/profile')
def profile():
# Assume the user's information is set in g.user by a middleware after login
g.user = {"name": "Alice", "id": 123}
return get_user_info() # Use g.user in another function
def get_user_info():
return f"User info: {g.user['name']}"
生命周期¶
- Start: Created when the user’s request reaches the Flask application.
- End: Destroyed after the server returns a response.
- Feature: Each request has an independent request context, and contexts between different requests do not interfere with each other.
三、应用上下文(App Context)¶
定义¶
Application context is the global environment of the entire Flask application, existing from application startup to shutdown. It is mainly used to store application-related data (such as configuration, application instance).
核心变量¶
current_app:Points to the current Flask application instance, used to access application configuration, blueprints, etc.
from flask import current_app
# Application configuration is defined in settings.py
class Config:
SECRET_KEY = "my-secret-key"
DATABASE_URI = "sqlite:///blog.db"
app = Flask(__name__)
app.config.from_object(Config)
@app.route('/config')
def show_config():
return f"Application secret key: {current_app.config['SECRET_KEY']}"
app:Directly points to the current application instance (butcurrent_appis more flexible and supports multi-application scenarios).
生命周期¶
- Start: Automatically created when the Flask application instance is created.
- End: Destroyed when the application shuts down.
- Feature: Multiple requests share the same application context, and all requests can access the same application configuration.
四、上下文的关键区别¶
| Feature | Request Context | App Context |
|---|---|---|
| Data Scope | Valid within a single request | Valid throughout the application lifecycle |
| Core Variables | request, g | current_app |
| Creation Timing | Automatically created at the start of each request | Automatically created when the application starts |
| Destruction Timing | Automatically destroyed at the end of a request | Automatically destroyed when the application shuts down |
| Purpose | Store request-related data | Store globally shared application-related data |
五、常见误区与注意事项¶
- Do not use
requestoutside a request context
If you userequestdirectly in a Python script (not in a view function/route function), it will throw an error because the request context does not exist at this time. For example:
# Wrong example: Using request directly in a script
from flask import request
print(request.args.get('name')) # Error: Request context does not exist
current_appmust be used within an application context
If the application is not initialized or the application context is not activated,current_appwill throw an error. For example:
# Wrong example: Not activating the application context
app = Flask(__name__)
with app.app_context(): # Must activate the application context first
print(current_app.config['SECRET_KEY']) # Correct
- The
gobject is request-level “temporary storage”
Do not reuse thegobject across multiple requests; it will be destroyed when the request ends.
六、总结¶
- Request context is a “single request’s exclusive environment”, using
requestto get request data andgto store temporary data. - Application context is a “global application environment”, using
current_appto access application configuration and instances. - The core of understanding context is: different data requires different “lifecycle management”, and Flask simplifies data transfer and sharing through the context mechanism.
If you are just starting to learn Flask, remember: In view functions, request is the “window to the current request”, current_app is the “window to the current application”, and g is a “temporary sticky note for a single request”. These tools will make your code cleaner and more efficient!