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()
### Flask Web框架工作原理 Flask是一个轻量级的Web应用框架,其设计哲学强调简单性和灵活性。当客户端发起请求时,该请求会通过WSGI服务器传递给Flask应用程序[^3]。 #### 请求处理过程 1. 客户端发送HTTP请求到服务器。 2. WSGI服务器接收此请求并将它转发至Flask应用实例。 3. 应用实例解析URL映射关系找到对应的视图函数(view function),这些映射通常定义在`route()`装饰器内。 4. 执行匹配上的视图函数来处理业务逻辑,并返回响应对象(Response Object)。 5. 响应被送回给WSGI服务器再由后者传输给原始请求方即浏览器或其他HTTP客户端。 ```python from flask import Flask, request app = Flask(__name__) @app.route('/') def index(): user_agent = request.headers.get('User-Agent') return f'<p>Your browser is {user_agent}</p>' if __name__ == '__main__': app.run(debug=True) ``` 这段代码展示了如何创建一个简单的Flask应用并设置了一个基本路由规则用于展示访问者的浏览器信息[^2]。 #### 构造图说明 对于更详细的架构理解,可以参考下述构造图描述: - **App Instance**: 实例化的Flask类负责整个应用程序生命周期内的全局状态管理和配置加载等工作。 - **Configurations**: 包含了各种环境变量以及自定义参数设定。 - **Blueprints & Views**: 蓝图为大型项目提供了更好的组织方式;而视图则是具体的页面控制器部分。 - **Templates/Static Files**: 存储HTML模板文件和静态资源如CSS、JavaScript等。 - **Extensions**: 插件扩展机制允许第三方库轻松集成进来提供额外功能支持。 - **Database Models**: ORM模型层用来操作数据库中的记录条目。 - **Forms Validation**: 表单验证组件确保提交的数据符合预期格式要求。 - **Migrations Scripts**: 数据库版本控制工具帮助维护不同阶段之间的模式变更历史记录。 - **Logging System**: 日志系统跟踪运行期间发生的事件以便后续排查问题或性能优化分析。 ![Flask Architecture Diagram](https://example.com/flask_architecture.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值