python - 在 flask 应用程序中保留全局状态

标签 python flask global state

我正在尝试在我的 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/

相关文章:

python - 如果我的 python webapp 中有一个 @staticmethod,我是否需要使用 threading.RLock() 来保护它?

python - 找不到页面的 flask 重定向URL(404错误)

javascript - 如何在 Angular js中编写服务器错误和成功的全局函数

python - 使用软连接逻辑加速字典合并

python - 如何在不同的数据源之间切换?

python - 如何分块加载 Pickle 文件?

python - Flask 将 POST 参数传递给自定义装饰器

javascript - 如何使用 flask [使用 flask 示例] 将 javascript 数组传递给 python 脚本

javascript - 从函数内部更改全局变量

c++ - 在 header 中定义常量字符串数组