如何在flask中保存变量或对象的状态并将其用于所有请求?

时间:2019-01-24 09:51:56

标签: python-3.x flask web-applications

我已经编写了一个简单的Flask网络应用程序来尽可能地模拟我的问题。

from flask import Flask, g

app = Flask(__name__)

class Foo:
    def __init__(self, x):
        '''Let's say this takes
        about 3-5 seconds
        '''
        self.x = x
    def __repr__(self):
        return f'Foo(x={self.x})'

def get_z():
    z = None
    def get():
        nonlocal z
        if z is None:
            z = Foo(30)
        return z
    return get
get_z = get_z()

@app.before_first_request
def set_x():
    g.x = Foo(10)

@app.before_request
def set_y():
    g.y = Foo(20)

@app.route('/x')
def get_x():
    return f'{g.x}'

@app.route('/y')
def get_y():
    return f'{g.y}'

@app.route('/z')
def get_z_():
    return f'{get_z()}'

if __name__ == '__main__':
    app.run(debug=True)

我希望我的应用程序上下文为我的所有请求存储对象。这些不是我可以存储在文本文件中并可以随时取回的数据。

我只有g.x是我的第一个请求。
我有g.y个请求。
我的所有要求也有g.z

flask.g在每次请求后都会刷新,因此不能用于存储所有后续请求的全局状态。这仅适用于第一个请求。

/x

否则,这是预期的错误。

/x(error)

每次应用程序收到请求时,我都无法使用@app.before_request来创建对象,因为创建对象需要一定的时间。该页面预计需要3-4秒的时间加载,因此这不是可行的解决方案。

/y

我尝试使用closure function或类似的方法来解决我的问题。 get_z函数确实解决了我的问题。第一次只需花费时间,随后的所有请求都会快速加载。

/z

我的问题是,有没有更好的方法来解决此问题?也许Flask本身提供了一些东西?

0 个答案:

没有答案