我正在尝试在我的 flask
应用程序中保存一个缓存字典。
据我了解,Application Context ,尤其是 flask.g object应该用于此。
设置:
import flask as f
app = f.Flask(__name__)
现在如果我这样做:
with app.app_context():
f.g.foo = "bar"
print f.g.foo
它打印 bar
。
继续以下内容:
with app.app_context():
print f.g.foo
AttributeError: '_AppCtxGlobals' object has no attribute 'foo'
我不明白,文档根本没有帮助。如果我正确阅读了它们,则应该保留状态。
另一个想法我的想法是简单地使用模块范围的变量:
cache = {}
def some_function():
cache['foo'] = "bar"
但似乎这些在每次请求时都会重置。
如何正确地做到这一点?
编辑: Flask 10.1
最佳答案
根据您的问题,我认为您对“全局”的定义感到困惑。
在现有的 Flask 设置中,您有一个 Flask 服务器,它具有多个线程,并且可能有多个进程处理请求。假设您有一个像“itemlist = []”这样的库存全局变量,并且您想在每个请求中继续添加它 - 例如,每次有人向端点发出 POST 请求时。这在理论上和实践上都是完全可能的。这也是一个非常糟糕的主意。
问题在于您无法轻松控制哪些线程和进程“获胜”——列表可能会以非常不稳定的顺序排列,或者完全损坏。所以现在你需要谈谈锁、互斥体和其他原语。这很难而且很烦人。
您应该尽可能保持网络服务器本身无状态。每个请求应该是完全独立的,并且不共享服务器中的任何状态。相反,请使用将为您处理状态的数据库或缓存层。这看起来更复杂,但实际上更简单。以 SQLite 为例;这很简单。
为了解决“flask.g”对象,它是一个基于每个请求的全局对象。
http://flask.pocoo.org/docs/api/#flask.g
它在请求之间被“删除干净”,不能用于在它们之间共享状态。
关于python - 在 flask 应用程序中保留全局状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19277280/