Как сохранить состояние переменной или объекта в колбе и использовать его для всех запросов? - PullRequest
0 голосов
/ 24 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...