from flask import Flask, current_app
"""
如果要使用flask的核心对象的话就要导入这个current_app
a = current_app 此时current_app的类型是localproxy类型
flask里面有两个上下文,分别是,应用上下文和请求上下文
应用上下文:是对Flask的封装
Flask:核心对象,其作用是承载了一些核心的功能.如注册路由,试图函数等
AppContext:封装了核心对象,并附加了一些额外参数
请求上下文:是对request的封装
Request:保存的核心的请求信息:如请求参数
RequestContext:对Request的封装,并附加了一些额外参数
如果想要使用flask\Request的核心对象时,最好是从他们封装的对象里面间接的去使用
栈:后进先出
队列:先进先出
flask的原理:
当一个请求进入flask时,flask首先会实例化一个RequestContext对象,这个RequestContext里面封装了本次请求的信息,并把这个信息保存在Request里.
同时RequestContext会把这个信息推入(通过def push(self)方法)到栈空间中(栈空间也是一个对象,flask将其实例化为_request_ctx_stack来表示),
但是在RequestContext在入站之前,会先去检查一下AppContext的栈(_app_ctx_stack)顶元素是否为空或是否为当前元素,如果为空的话,会先把AppContext
推入到栈空间(_app_ctx_stack)中,在将RequestContext推入_request_ctx_stack中
current_app(LocalProxy)\request(LocalProxy)原理:
这两个变量永远都指向_app_ctx_stack和_request_ctx_stack的栈顶,无论对这两个元素做什么操作都是等于在操作这两个栈的栈顶元素,而这两个栈的栈顶
分别是AppContext和RequestContext.如果这两个栈的栈顶是空的话,则会出现unbound的标识
current_app = LocalProxy(_find_app)
def _find_app():
这里的top就是取的栈顶的元素,也就是栈顶的上下文
top = _app_ctx_stack.top
if top is None:
raise RuntimeError(_app_ctx_err_msg)
这里返回的是栈顶上下文的app元素,也就是栈顶上下文的核心对象
return top.app
"""
app = Flask(__name__)
# 获取AppContext
ctx = app.app_context()
# 手动将核心对象推入到栈顶
# ctx.push()
# 此时这里会出现unbound是因为栈顶元素是空,如果不想出现此问题,则需要手动将AppContext推入到栈中
a = current_app
b = current_app.config['DEBUG']
print(b)
ctx.pop()