应用上下文
Flask 中有两个应用上下文对象:
current_app 对象
g 对象
current_app对象:
current_app 对象,它被绑定到当前请求的应用的引用。
如果在程序中需要访问应用,那么需要将应用显式地到处传递应用,如果使用current_app对象,我们不需要关心创建的应用,当我们访问current_app对象的时候,实际上是访问请求的应用。
# coding=utf-8
# 导入Flask类
from flask import Flask, current_app
# 在创建app应用的时候,每个创建的对象名可能都不一样。
# 使用current_app 应用上下文,我们可以不用关心应用怎么创建的。
#app = Flask(__name__)
#app_2 = Flask(__name__)
my_app = Flask(__name__)
class Config(object):
USERNAME = 'hello'
PASSWORD = '123456'
app.config.from_object(Config)
@app.route('/')
def index():
username = current_app.config.get("USERNAME") # 可以不通过Flask实例名称获取配置
password = current_app.config.get("PASSWORD") # 获取配置
return 'username=%s,password=%s'%(username,password)
if __name__ == '__main__':
# Flask 应用程序实例的方法run启动web服务器
app.run(debug=True)
g对象
有时候应用上下文会在必要时被创建和销毁。它不会在线程间移动,并且也不会在不同的请求之间共享。
处理请求时,临时存储的对象,每次请求都会重设这个变量。
比如 数据库连接,请求进来的时候创建连接,在处理完成之后,释放连接。
通过请求钩子deardown_request函数中通过g对象将数据库连接对象传到这个函数中去关闭连接。确保数据库资源能被释放。
g对象是应用上下文的一种,每一个请求过来都会创建一个g对象。g对象就是一个作用于app应用的全局变量。每个请求进来g对象都先置为空。
在钩子函数与视图函数中变量的传递,可以用g对象做为全局变量去传递。
from flask import Flask, g
# 每次请求之前执行
@app.before_request
def before_request_():
g.s = 'g对象传过来的参数'
print('before_request执行')
@app.route('/')
def index():
print('index 执行')
# 在视图函数中通过g对象获取参数
print(g.get('s'))
return 'ok'
请求上下文
请求上下文保存了客户端和服务器交互的数据
Flask 中请求上下文有两个对象:
request 对象
session 对象