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

    在这里插入图片描述

    注:
    如果觉得笔记有些问题,麻烦在百忙之中在评论中指正,或提出建议!另外,如果觉得这份笔记对你有所帮助,麻烦动动发财的小手手点一波赞!
  • 相关阅读:
    力扣刷题学习SQL篇——1-5 修改(变更性别——使用判断if/case when)
    RabbitMQ 使用细节 → 优先级队列与ACK超时
    C++:重载
    装饰器模式详解和实现(设计模式 二)
    12.3 实现模拟鼠标录制回放
    flutter开发实战-hero动画简单实现
    登上抖音同城热搜榜:如何让你的短视频成为焦点?
    他因“上帝粒子”获诺奖,却火速搬到乡下:它毁了我的生活
    记一次TheadLocal使用方式不正确导致内存泄漏问题的排查和修复过程
    nordic 52832中添加RTT打印
  • 原文地址:https://blog.csdn.net/qq_55961861/article/details/126574586