关于 Flask 上下文的详细介绍,分为两个部分:
一、什么是Flask上下文
在 Flask 中,上下文是指当前应用和请求的状态。可以把上下文看作是一个全局变量,它存储了 Flask 应用的配置信息、请求和响应、Session 和 Cookies 等。在 Flask 中,有两种类型的上下文:应用上下文和请求上下文。
1. 应用上下文
应用上下文是关于Flask应用本身的数据, 是 flask.Flask 应用实例在内部使用的对象。每个 Flask 应用都有一个应用上下文,当 Flask 应用被创建时,应用上下文也被创建。
使用 Flask 的上下文,可以获取到应用实例 app 对象等。
from flask import Flask, current_app
app = Flask(__name__)
with app.app_context():
print(current_app.name)
app_context() 可以返回一个应用上下文,使用 with 语句可以实现自动推入和弹出应用上下文。
2. 请求上下文
请求上下文,是关于当前请求的上下文,是 flask.request 内部使用的对象。每个请求都需要创建一个请求上下文,它包含了当前请求的信息,如请求头、请求方法、请求路径等。
使用 Flask 的上下文,可以获取到请求的相关信息,如请求路径、方法、参数等。
from flask import Flask, request
app = Flask(__name__)
@app.route('/hello')
def hello():
return "Hello World!"
with app.test_request_context('/hello', method='POST'):
# 构建一个请求上下文
# 发送POST请求到 /hello
resp = app.full_dispatch_request()
print(resp)
test_request_context() 可以追踪请求,用于测试,并返回请求上下文对象,可以手动插入一个 flask.request 对象,来描述当前请求的环境。
二、Flask上下文的使用
在 Flask 中,上下文管理器和上下文变量是在 Flask 上下文管理器中使用的。
截至 Flask 0.9 版本,Flask 针对两种上下文,提供了以下上下文变量:
1. 应用上下文
app
:当前激活的 Flask 应用实例。g
:一个底层实现,在一次请求中存储数据的临时对象。通常用于在不同模块或函数间共享一些数据,并且不想使用全局变量或在每个函数间传递参数。current_app
:应用上下文变量,指向当前激活的 Flask 应用。
2. 请求上下文
request
:一个请求对象,包含了客户端提交的 HTTP 请求数据,如请求头、请求数据和查询字符串等。request 对象只在处理请求期间有效。如果在请求处理期间没有处理请求,那么使用 request 对象会抛出异常。session
:会话对象,用于存储和访问请求间的数据。注意,session 对象没有默认的实现,需要 Flask 应用开发人员自行选择适合自己的实现,并在应用初始化时配置。
在使用 Flask 上下文变量时,需要注意以下点:
- 上下文变量无法跨越 Flask 应用实例或请求进行调用。
- 上下文对象只在请求生存周期内有效,在请求外部调用时会出现“RuntimeError: working outside of application context”错误,需要通过上下文对象使之有效。
- 有些变量,如 g 和 session,需要开发人员自行初始化实现并在应用程序初始化时配置。
示例
下面是一个关于 Flask 上下文的示例,可以更好的理解 Flask 上下文的使用和意义。
from flask import Flask, request, session, g, current_app
app = Flask(__name__)
app.secret_key = 'secret_key'
@app.route('/')
def index():
session['message'] = 'Hello, Flask!'
return 'Message stored in session!'
@app.route('/get_message')
def get_message():
message = session.get('message', 'No message found in session!')
return message
@app.before_request
def before_request():
g.db = 'Database connection!'
@app.route('/get_db')
def get_db():
db = g.get('db', 'No connection!')
return db
with app.app_context():
current_app.logger.debug('Log message goes here!')
if __name__ == '__main__':
app.run(debug=True)
上面的例子展示了使用 Flask 上下文的典型方式。其中,使用 session 变量存储消息,实现了不同请求之间数据共享;使用 before_request 函数,在每个请求之前创建数据库连接;使用 app_context() 实现日志记录。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Flask 上下文详细介绍 - Python技术站