Flask - 应用上下文

目录

一、应用上下文

二、current_app - 在任何地点,获取flask.app对象

三、g - 单次请求的数据存储字典

四、应用上下文的手动推送


一、应用上下文

官方文档

Flask的请求处理流程和上下文流程理解参考

该Flask 应用程序对象具有的属性,比如 config ,那些对视图和内访问有用的CLI命令。但是,app在项目中的模块中导入实例很容易出现循环导入问题。使用应用工厂模式或编写可重复使用的蓝图或 扩展时,根本不会app导入实例。

Flask使用应用程序上下文解决了这个问题。app您可以使用current_app 代理来指向处理当前活动的应用程序,而不是直接引用。

Flask 在处理请求时自动推送应用程序上下文。查看函数,错误处理程序以及在请求期间运行的其他函数都可以访问current_app

在运行Flask.cli使用注册的CLI命令时,Flask还将自动推送应用程序上下 @app.cli.command()。
 

二、current_app - 在任何地点,获取flask.app对象

flask.current_app

处理当前请求的应用程序的代理。这对于访问应用程序而不需要导入它,或者无法导入应用程序非常有用,例如在使用应用程序工厂模式或蓝图和扩展时。

这仅在推送应用程序上下文时可用 。这在请求和CLI命令期间自动发生。它可以手动控制app_context()

例如: 当你的项目中使用了蓝图,那仅仅在app创建阶段,app是Flask对象,经过了蓝图分发之后就会变成Bluepoint对象,而无法使用Flask.app内的属性。因此可使用current_app 获取flask.app的属性。

三、g - 单次请求的数据存储字典

flask.g

可在应用程序上下文中存储数据的命名空间对象 。这是一个Flask.app_ctx_globals_class默认 为的实例 ctx._AppCtxGlobals。

这是在请求期间存储资源的好地方。在测试期间,您可以使用伪造资源和上下文模式来预配置此类资源。

from flask import g
@app.before_first_request
def first():
    # 若不使用g使用其他给予的全局变量,存在覆盖的危险;作者因此提供g作为全局变量使用
    # request.method='111'
    g.name='test'
    pass


# g的应用:每次请求都会自动创建db的连接,请求结束则连接关闭
from flask import g

def get_db():
    if 'db' not in g:
        g.db = connect_to_database()

    return g.db

@app.teardown_appcontext
def teardown_db():
    db = g.pop('db', None)

    if db is not None:
        db.close()

四、应用上下文的手动推送

# 未推送上下文的错误信息
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that
needed to interface with the current application object in some way.
To solve this, set up an application context with app.app_context().

# 推送上下文方式,推送后,g 可以使用,当前线程的 current_app 指向app
app = Flask(……)
app.app_context().push()

# 使用with的推送方式
def create_app():
    app = Flask(__name__)

    with app.app_context():
        init_db()

    return app

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/88837480