Предположим, у меня есть класс, в котором хранятся важные динамические данные, которые мне нужны для рендеринга моих сайтов. Этот класс должен быть создан индивидуально для каждого пользователя, а данные из класса должны обновляться в соответствии с некоторым пользовательским вводом, так что, по крайней мере, две точки зрения:Доступ к экземплярам класса в нескольких флягах?
@app.route('/')
def index():
myclass = MyClass()
return render_template('index.html')
@app.route('/_update', methods=['GET'])
def update():
ret_data = {"value": request.args.get('c', type=float)}
a = myclass.calculate(ret_data['value'])
return jsonify(result=a)
Ofcourse он не может работать таким образом, потому что myclass
не существовало бы в update()
- поэтому рабочим решением было бы сделать myclass
глобальным при создании. Но это не кажется чистым, и это разрушает возможность отдельных классов за сеанс.
Итак, есть ли какой-либо чистый способ доступа к экземпляру класса в разных представлениях, или как мне с этим справиться, это не похоже на необычный сценарий для меня.
Во-вторых, я хотел бы, чтобы экземпляр класса был создан для каждого пользователя, но также закрыт, когда каждый пользователь закрывает окно своего браузера и т. Д. - Я действительно не понимаю, как это сделать, у меня есть функция __del__()
мой класс, но он не будет использоваться, если я установил экземпляр в глобальный.
спасибо!
Спасибо, вы абсолютно правы, я пока мало знаю о веб-приложениях. Позвольте мне попытаться объяснить немного больше моей проблемы: класс занимает много времени, чтобы начать (допустим, 20 секунд) - поэтому он должен запускаться только один раз для пользователя, например. после того, как он нажал кнопку «Старт».Впоследствии экземпляр класса по-прежнему необходим, поскольку он выполняет некоторые вычисления в зависимости от ввода пользователя и отправки новых данных клиенту (на самом деле клиент запрашивает данные), но поскольку классу требуется много памяти, он должен закрываться, когда пользователь уходит/выходит в течение некоторого времени. – lakerz
Я не вижу прямо сейчас, как база данных может это решить - поскольку мой класс уже ведет себя (наивно думает), как база данных. Я имею в виду, что я мог хранить исходные данные класса в базе данных, но что, когда вызывается 'update()'? Мне нужно обновить данные базы данных точно из одного экземпляра класса. – lakerz
Дело в том, что между пользователем и внутренним процессом нет постоянной связи. Поэтому, даже если вы создавали экземпляр своего класса по первому запросу для пользователя, следующий запрос от этого пользователя, вероятно, не перейдет к одному и тому же процессу; и следующий запрос к этому процессу, вероятно, будет от отдельного пользователя. Единственный способ сделать что-то вроде этого - использовать длительные соединения (например, Websockets), что является совершенно другим способом написания приложений. –