Python Flask, пользовательский статус фонового процесса в качестве ответа - PullRequest
0 голосов
/ 13 ноября 2018

У меня проблемы с возвратом пользовательского ответа из фонового процесса, который занимает много времени, и он вызывается из функции просмотра во 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 (), номер отображается нормально, поэтому я не думаю, что проблема в потоке.

Использую ли я правильный подход к этой проблеме, или есть ли другой способ отобразить состояние процесса на клиенте?

...