current_app
和g
都是应用程序上下文变量,因此每个请求都会加载和卸载它们,因此存储在它们上的所有数据都只能在同一个请求中使用。
我能看到的唯一区别是g
在每个请求开始时开始为空,而current_app
以从应用程序对象复制的某些属性(如config
)开始。但这并不能成为g
对象的理由,因为人们可以轻松地在current_app
上存储新信息。
我没有看到有什么区别?
答案 0 :(得分:4)
我相信您在g
和current_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?
旁注:为用户检出上下文处理器(由它返回的命令可直接用于所有模板)