我正在研究Flask tutorial,并对使用应用程序上下文连接数据库感到困惑。在页面上,作者说:
始终创建和关闭数据库连接非常 效率低下,所以你需要保持更长时间。因为 数据库连接封装了一个事务,您将需要进行 确保一次只有一个请求使用连接。
但是,创建和关闭连接似乎正是代码所完成的。我们有一个连接到数据库的视图get_db
,返回一个连接对象,如果不存在,则将其添加到应用程序上下文中。我们还有一个close_db
视图,可以在应用程序上下文被拆除时关闭连接对象。
我对此处发生的事情的理解如下:用户连接到应用程序的主页,建立与数据库的连接,然后关闭它。每次用户向页面发出请求(例如,发布新的博客条目)时,与数据库建立新连接,然后在请求完成时关闭。那么使用应用程序上下文的价值是什么呢?为什么不直接为每个请求创建和关闭连接?
也许我在这里误解了一些东西 - 任何洞察力都赞赏!
答案 0 :(得分:4)
记录错误。但基本上应用程序上下文的重点是抽象特定于应用程序但持久性跨请求的数据对象(表面上允许多租户应用程序,它们都是Flask
的单独实例,而不会将所有内容都绑定到请求上下文)。在任何情况下,flask.g
是当前应用程序上下文的应用程序上下文特定的dict。这样,您可以在第一个请求上调用get_db()
,将生成的连接对象推送到g
,然后在应用中使用g.dbconn
,这不会被杀死每个请求(可能是您希望在每个页面访问时使用相同的连接)。我想将flask.g
看作是globals()
的一个类(在本例中是应用程序)。
另请参阅:http://flask.pocoo.org/docs/0.12/appcontext/#app-context