请教一些关于 Flask 应用上下文 的问题

2017-08-24 21:59:22 +08:00
 wisej

查阅一番资料后,大概了解了下应用上下文的机制。

http://flask.pocoo.org/docs/0.12/appcontext/#app-context 中,有这么一句话 :"The context is typically used to cache resources that need to be created on a per-request or usage case." 然后举例将一个数据库的连接( db )绑定到 g 上,又通过 @app.teardown_appcontext 来关闭连接 db。既然 应用上下文 会随每个请求的结束而销毁,那么 db 不就会在每次请求的开始前创建连接,又在结束后关闭连接么?完全谈不上缓存或者复用啊。

1.g 的生命周期明明就一个请求的开始和结束,为什么能说用来cache resources

2.我能不能在应用上下文结束时不关闭连接,这样下次有请求来不就不用再去创建连接,达到复用么?(弊端可能就是一段时间后连接可能会失效?)

3253 次点击
所在节点    Flask
12 条回复
SErHo
2017-08-24 23:03:20 +08:00
使用连接池或者全局的连接对象吧
hxndg
2017-08-24 23:17:05 +08:00
我记得原先有段时间我也纠结这个。。。
g 就是请求上下文开始结束时生存,不太明白到底是 cache 什么。
你看看这个有没有用?有点迷惑应用上下文和连接有直接关系么?
https://blog.tonyseek.com/post/the-context-mechanism-of-flask/
hxndg
2017-08-24 23:20:13 +08:00
我又想了一下,g 应该说是生存在应用上下文,但是跟随每个请求上下文,这应该是它说 cache 的意思?
每个连接都会压一个应用上下文?所以应用上下文和连接相对独立?可能你得改改底下的代码,好吧,我也有点蒙了
skywatcher
2017-08-24 23:31:18 +08:00
flask.g
Just store on this whatever you want. For example a database connection or the user that is currently logged in.

Starting with Flask 0.10 this is stored on the application context and no longer on the request context which means it becomes available if only the application context is bound and not yet a request. This is especially useful when combined with the Faking Resources and Context pattern for testing.

------------
http://flask.pocoo.org/docs/0.10/api/#application-globals
TJT
2017-08-24 23:51:13 +08:00
我用来缓存用户信息,代码在不同地方都会查询用户信息,用 g 就可以避免一次请求重复查询几次用户信息,也不用把用户信息传来传去。
wisej
2017-08-24 23:51:21 +08:00
@skywatcher 这句话,“ To share data that is valid for one request only from one function to another,”。我不是很明白,一个请求不是就对应一个视图函数么,那为什么会 from one function to another ?除了视图函数里含有 redirect 的情况
wwqgtxx
2017-08-24 23:54:26 +08:00
@wisej 不是还有各种钩子么,比如 app.before_request 之类的
rogwan
2017-08-24 23:57:31 +08:00
还有个 app context 的 push,也比较容易搞混。
hxndg
2017-08-25 00:03:38 +08:00
@wisej 我一直理解的一个 request 对应的实际上是一个 app,也就是你开始定义的那个 app,而不是对应的一个 function。。。
wisej
2017-08-25 00:19:52 +08:00
@hxndg 一样吧。一个 request 交由一个 app 实例处理,最后实质上不就是相当于执行路由匹配到的视图函数么。所以我就那么说了..
billlee
2017-08-25 00:37:32 +08:00
@wisej #6 复杂的应用,一个请求进来后,处理函数可能一个个嵌套了好多层,把 request, g 这些搞成 context-local variable, 就不需要再把这些东西一层层用函数参数传递
wisej
2017-08-25 01:02:44 +08:00
@billlee 了解了,感谢解释

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/385574

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX