Flask原理

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值