У меня проблемы с возвратом пользовательского ответа из фонового процесса, который занимает много времени, и он вызывается из функции просмотра во Flask. Я использую метод EventSource из HTML, чтобы отобразить статус процесса для пользователя. Процесс инкапсулирован в объект, созданный в функции view, и мне нужен способ сигнализировать о состоянии процесса.
Значимыми частями объекта являются:
class MyObject:
self.status = 0
def signal_status(self):
yield self.status
def doSomeProcess(self):
self.status = 1
self.foo()
self.status = 2
self.bar()
self.status = 3
def process_call(self):
Thread(target=self.async_process, args=(app, data)).start()
def async_process(self, app, data):
with app.app_context():
self.doSomeProcess(data)
А с маршрутов:
myObj = MyObject()
@app.route('/process/<data>')
def process(data):
global myObject
myObject.process_call(data)
return render_template('process.html')
@app.route('/progress')
def progress():
global myObject
return Response(myObject.signal_status(), mimetype='text/event-stream')
Тогда я пытаюсь восстановить код в js из ответа, подобного этому:
<script>
var source = new EventSource("/progress");
source.onmessage = function(event) {
console.log(event.data);
}
</script>
Однако в консоли ничего не появляется, кроме сообщения ответа 200. Я пытался привести приведение к выходу ответа от signal_status (). Если я распечатываю вызов signal_status (), номер отображается нормально, поэтому я не думаю, что проблема в потоке.
Использую ли я правильный подход к этой проблеме, или есть ли другой способ отобразить состояние процесса на клиенте?