• 关于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

    在这里插入图片描述

    注:
    如果觉得笔记有些问题,麻烦在百忙之中在评论中指正,或提出建议!另外,如果觉得这份笔记对你有所帮助,麻烦动动发财的小手手点一波赞!
  • 相关阅读:
    语音信号的仿真原理
    【C语音 || 数据结构】二叉树--堆
    [NOIP2012 提高组] 借教室
    Spark-机器学习(4)回归学习之逻辑回归
    C语言sizeof函数解析
    切面aspect处理fegin调用转本地调用
    [Python]dict字典排序事例
    4、FFmpeg命令行操作3
    推荐一个带java环境的tomcat镜像,使用jdk 1.8.0_312
    代码随想录算法训练营第五十八天 | 583. 两个字符串的删除操作、72. 编辑距离
  • 原文地址:https://blog.csdn.net/qq_55961861/article/details/126574586