查阅一番资料后,大概了解了下应用上下文的机制。
在 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.我能不能在应用上下文结束时不关闭连接,这样下次有请求来不就不用再去创建连接,达到复用么?(弊端可能就是一段时间后连接可能会失效?)
1
SErHo 2017-08-24 23:03:20 +08:00 via iPhone 1
使用连接池或者全局的连接对象吧
|
2
hxndg 2017-08-24 23:17:05 +08:00 1
我记得原先有段时间我也纠结这个。。。
g 就是请求上下文开始结束时生存,不太明白到底是 cache 什么。 你看看这个有没有用?有点迷惑应用上下文和连接有直接关系么? https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ |
3
hxndg 2017-08-24 23:20:13 +08:00
我又想了一下,g 应该说是生存在应用上下文,但是跟随每个请求上下文,这应该是它说 cache 的意思?
每个连接都会压一个应用上下文?所以应用上下文和连接相对独立?可能你得改改底下的代码,好吧,我也有点蒙了 |
4
skywatcher 2017-08-24 23:31:18 +08:00 1
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 |
5
TJT 2017-08-24 23:51:13 +08:00
我用来缓存用户信息,代码在不同地方都会查询用户信息,用 g 就可以避免一次请求重复查询几次用户信息,也不用把用户信息传来传去。
|
6
wisej OP @skywatcher 这句话,“ To share data that is valid for one request only from one function to another,”。我不是很明白,一个请求不是就对应一个视图函数么,那为什么会 from one function to another ?除了视图函数里含有 redirect 的情况
|
8
rogwan 2017-08-24 23:57:31 +08:00 via Android
还有个 app context 的 push,也比较容易搞混。
|
9
hxndg 2017-08-25 00:03:38 +08:00
@wisej 我一直理解的一个 request 对应的实际上是一个 app,也就是你开始定义的那个 app,而不是对应的一个 function。。。
|
10
wisej OP @hxndg 一样吧。一个 request 交由一个 app 实例处理,最后实质上不就是相当于执行路由匹配到的视图函数么。所以我就那么说了..
|
11
billlee 2017-08-25 00:37:32 +08:00 1
@wisej #6 复杂的应用,一个请求进来后,处理函数可能一个个嵌套了好多层,把 request, g 这些搞成 context-local variable, 就不需要再把这些东西一层层用函数参数传递
|