我已经编写了一个简单的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
在每次请求后都会刷新,因此不能用于存储所有后续请求的全局状态。这仅适用于第一个请求。
否则,这是预期的错误。
每次应用程序收到请求时,我都无法使用@app.before_request
来创建对象,因为创建对象需要一定的时间。该页面预计需要3-4秒的时间加载,因此这不是可行的解决方案。
我尝试使用closure function
或类似的方法来解决我的问题。 get_z
函数确实解决了我的问题。第一次只需花费时间,随后的所有请求都会快速加载。
我的问题是,有没有更好的方法来解决此问题?也许Flask
本身提供了一些东西?