我正在尝试在flask应用程序中保存缓存字典。
flask
据我了解,应使用Application Context,尤其是flask.g对象。
设定:
import flask as f app = f.Flask(__name__)
现在,如果我这样做:
with app.app_context(): f.g.foo = "bar" print f.g.foo
它打印bar。
bar
继续执行以下操作:
with app.app_context(): print f.g.foo AttributeError: '_AppCtxGlobals' object has no attribute 'foo'
我不明白,文档也完全没有帮助。如果我正确阅读它们,状态应该已经保留。
我的另一个想法是简单地使用模块范围的变量:
cache = {} def some_function(): cache['foo'] = "bar"
但是似乎这些随着每个请求而重置。
如何正确做到这一点?
编辑:flask10.1
根据你的问题,我认为你对“全局”的定义感到困惑。
在常规Flask设置中,你将拥有一台Flask服务器,该服务器具有多个线程以及可能有多个处理请求的进程。假设你有一个股票全局变量,例如“ itemlist = []”,并且你希望在每个请求中(例如,每次有人向端点发出POST请求时)都继续添加该变量。这在理论和实践上都是完全可能的。这也是一个非常糟糕的主意。
问题在于,你无法轻松控制哪些线程和进程“获胜”-列表可能会以一个非常古怪的顺序出现,或者完全损坏。因此,现在你需要讨论锁,互斥锁和其他原语。这是困难而烦人的。
你应该使Web服务器本身尽可能保持无状态。每个请求应该完全独立,并且不共享服务器中的任何状态。而是使用将为你处理状态的数据库或缓存层。这似乎更复杂,但实际上实际上更简单。以SQLite为例; 这很简单。
要解决“ flask.g”对象,即基于每个请求的全局对象。