current_app和g上下文变量之间有什么区别?

时间:2016-11-30 06:32:10

标签: python flask

current_appg都是应用程序上下文变量,因此每个请求都会加载和卸载它们,因此存储在它们上的所有数据都只能在同一个请求中使用。

我能看到的唯一区别是g在每个请求开始时开始为空,而current_app以从应用程序对象复制的某些属性(如config)开始。但这并不能成为g对象的理由,因为人们可以轻松地在current_app上存储新信息。

我没有看到有什么区别?

2 个答案:

答案 0 :(得分:4)

我相信您在gcurrent_app上阅读了文档。所以我能从中理解:

current_app

  

指向处理请求的应用程序。这对于希望支持多个应用程序并行运行的扩展程序非常有用。

[强调我的]

所以你得到了当前应用的上下文,而g存储了所有内容,来自source code

def _lookup_app_object(name):
    top = _app_ctx_stack.top
    if top is None:
        raise RuntimeError(_app_ctx_err_msg)
    return getattr(top, name)

def _find_app():
    top = _app_ctx_stack.top
    if top is None:
        raise RuntimeError(_app_ctx_err_msg)
    return top.app

current_app = LocalProxy(_find_app)
g = LocalProxy(partial(_lookup_app_object, 'g'))

因此,如果您正在运行多个应用程序,current_app将引用当前的一个(显而易见的,正确的),并g引用所有应用程序。

答案 1 :(得分:0)

从文档中:

  

请求开始时,将创建并推送一个RequestContext,   如果创建上下文,则首先创建并推送一个AppContext   应用程序还不是最重要的上下文。虽然这些上下文是   推送后,就可以使用current_app,g,request和session代理   到处理请求的原始线程。

当您在浏览器上发出第一个请求时,将创建和应用程序上下文并将其推送到堆栈中,然后在堆栈顶部创建并弹出请求上下文。关键是-应用程序上下文位于请求堆栈数据结构的底部。

更多有关g的信息:它是一个名称空间对象,可以在应用程序上下文中存储数据。这是在请求期间存储资源的好地方。 g is a special object that is unique for each request. It is used to store data that might be accessed by multiple functions during the request.如果在同一请求中第二次调用get_db,则连接将被存储和重用,而不是创建新的连接。 更多:When should Flask.g be used?

旁注:为用户检出上下文处理器(由它返回的命令可直接用于所有模板)