Я написал простое 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
само предоставляет?