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()
Flask原理
最新推荐文章于 2024-06-12 22:47:05 发布