Flask中的应用程序作用域变量是什么?

13

在Flask中是否有应用程序范围的Python变量?我想实现一些用户之间的基本消息传递和共享数据缓存。当然,可以通过数据库实现这一点,但我想知道也许有一种不需要数据库且更快的方法。理想情况下,共享变量将是一个活动的Python对象,但是字符串和整数也可以满足我的需求。

编辑:与(不起作用的)示例补充

from flask import g

@app.route('/store/<name>')
def view_hello(name=None):
    g.name = name
    return "Storing " + g.name

@app.route("/retrieve")
def view_listen():
    n = g.name
    return "Retrieved: " + n
尝试检索g.name时,会触发以下错误: AttributeError: '_RequestGlobals'对象没有'name'属性
2个回答

4

我不确定这是否是一个好主意,但我一直在使用这种方法来方便地在请求之间共享数据:

class MyServer(Flask):

    def __init__(self, *args, **kwargs):
            super(MyServer, self).__init__(*args, **kwargs)

            #instanciate your variables here
            self.messages = []

app = MyServer(__name__)

@app.route("/")
def foo():
    app.messages.append("message")

1
这种方法假设在请求之间共享的是同一个应用程序对象,并且它永远不会死亡。我非常确定,在比 Flask 框架内置的简单开发 Web 服务器更复杂的情况下,这种假设是不成立的。 - Passiday
1
是的,你说得对。对于非常小而简单的应用程序来说,这是一种共享数据的简单方法。 - t.animal

-8

从Flask 0.10版本开始,flask.g 是一个不错的选择。

在较早版本中,flask.g 存储在请求上下文中,并在请求之间清除。如果您使用的是旧版本,则应将应用级别的内容存储在 flask.current_app 中。


3
文档中提到flask.g是一个特殊对象,确保它仅对活动请求有效,并且将为每个请求返回不同的值。很明显,这并不是这个问题的正确答案。 - shuaiyuancn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接