应用上下文:
flask将代码执行分为了两种状态:1、Flask请求被实例化后到第一个请求到来之前(此时应该是应用上下文);2、第一个请求到来之后(此时应该是请求上下文)。
flask会有多个应用,然而为每个应用都创建一个请求上下文的话,代价是比较大的,所以,flask引入了应用上下文的概念。flask中存在多个应用,如何找到“正确地”的应用,解决方案是current_app代理对象。
应用上下文就是对应于第一种状态。在第一种状态中,你可以做的事情有:
1、程序员可以安全地修改应用对象;
2、目前还没有处理任何请求
3、你必须的有一个指向应用对象的引用(应该是current_app)来修改它。不会有某个神奇的代理变量指向你刚创建的或者正在修改的应用对象的。
可以隐式地创建应用上下文(当创建创建请求上下文时,没有此时应用没有上下文,那么自动创建应用上下文),这种方式程序员不用管。
可以显式地调用app_context()方法来创建应用上下文:
from flask import Flask,current_app
app=Flask(__name__)
with app.app_context():
#此时,current_app已经指向了app
print current_app.name
应用上下文会在必要时被创建和销毁。它不会在线程间移动,并且也不会在不同的请求之间共享。正因为如此,它是一个存储数据库连接信息或是别的东西的最佳位置。内部的栈对象叫做flask._app_ctx_stack。扩展可以在最顶层自由地存储额外信息,想象一下它们用一个充分独特的名字在那里存储信息,而不是在flask.g对象里,flask.g是留给用户的代码用的。
更详细的内容可参考应用上下文:http://docs.jinkan.org/docs/flask/appcontext.html#app-context
flask上下文机制:https://blog.tonyseek.com/post/the-context-mechanism-of-flask/#id15