• 关于Flask高级_上下文的介绍和基本操作


    Flask高级_上下文

    一.上下文

    每一段程序都有很多外部变量,只有像add这种简单的函数才是 没有外部变量的。 一旦一段程序有了外部变量,这段程序就不 完整,不能独立运行。为了能让这段程序可以运行,就要给所 有的外部变量一个一个设置一些值。就些值所在的集合就是叫 上下文。
    并且上下文这一概念在中断任务的场景下具有重大意义,其中 任务在被中断后,处理器保存上下文并提供中断处理,因些在 这之后,任务可以在同一个地方继续执行。(上下文越小,延迟 越小)
    上下文的一个典型应用场景就是用来缓存一些我们需要在发生请求 之前或者要使用的资源。举个例子,比如数据库连接。当我们在应 用上下文中来存储东西的时候你得选择一个唯一的名字,这是因为 应用上下文为 Flask 应用和扩展所共享。

    二.应用上下文

    应用上下文是存放到一个 LocalStack 的栈中。和应用app相关的操作就 必须要用到应用上下文
    注意:
    在视图函数中,不用担心应用上下文的问题。因为视图函数要 执行,那么肯定是通过访问url的方式执行的, 那么这种情况下,Flask底层就已经自动的帮我们把应用上下文 都推入到了相应的栈中。
    如果想要在视图函数外面执行相关的操作,那么就必须要手动推入应用上下文。

    三.请求上下文

    请求上下文也是存放到一个 LocalStack 的栈中。
    和请求相关的操作就必须用到请求上下文,比如使用 url_for 反转视图 函数
    注意:
    在视图函数中,不用担心请求上下文的问题。
    因为视图函数要执行,那么肯定是通过访问url的方式执行的, 那么这种情况下,Flask底层就已经自动的帮我们把应用上下文 和请求上下文都推入到了相应的栈中。
    如果想要在视图函数外面执行相关的操作,那么就必须要手动推入请求上下文。
    底层代码执行说明:
    1. 推入请求上下文到栈中,会首先判断有没有应用上下文
    2. 如果没有那么就会先推入应用上下文到栈中
    3. 然后再推入请求上下文到栈中

    四.总结

    为什么上下文需要放在栈中?
    1. 应用上下文:Flask底层是基于werkzeug,werkzeug是可以 包含多个app的,所以这时候用一个栈来保存。 如果你在使用app1,那么app1应该是要在栈的顶部,如果用完 了app1,那么app1应该从栈中删除。方便其他代码使用下面的 app。
    2. 如果在写测试代码,或者离线脚本的时候,我们有时候可能 需要创建多个请求上下文,这时候就需要存放到一个栈中了。 使用哪个请求上下文的时候,就把对应的请求上下文放到栈的 顶部,用完了就要把这个请求上下文从栈中移除掉。

    五.实例

    #coding=utf-8
    
    from flask import Flask,current_app,url_for
    
    
    app = Flask(__name__)
    
    app_context = app.app_context()
    app_context.push()
    print(current_app.name)
    
    with app.app_context():
        print(current_app.name)
    
    @app.route('/show/')
    def show():
        return f'这是一个内容:{current_app.name}'
    
    with app.test_request_context():
        url = url_for('show')
        print(f'show函数的映射路径为:{url}')
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    注:
    如果觉得笔记有些问题,麻烦在百忙之中在评论中指正,或提出建议!另外,如果觉得这份笔记对你有所帮助,麻烦动动发财的小手手点一波赞!
  • 相关阅读:
    web前端——HTML
    深入解析PHP框架:Symfony框架详解与应用
    QT5.15在Ubuntu22.04上编译流程
    测试和验证有什么区别,怎么划分测试集和验证集
    华为HCIE云计算之FC添加ipsan数据存储
    大模型之十二十-中英双语开源大语言模型选型
    OSI参考模型
    Pwn 学习 fmt_str_level_1_x86 格式化字符串
    深度比较常见库中序列化和反序列化性能的性能差异
    vue3中插槽的使用与用处
  • 原文地址:https://blog.csdn.net/qq_55961861/article/details/126574586