我想在執行一項耗時的任務時在模板中顯示進度。我首先讓它在一個功能上作業。
@app.route('/process', methods=['GET','POST'])
def process():
def test():
for i in range(5):
time.sleep(1)
yield f'data:{i}\n\n'
return Response(test(), mimetype='text/event-stream')
用于在任務完成后顯示和停止。
$('#process').on('click', e => {
var source = new EventSource('/process');
source.onmessage = (e) => {
$('#result').text(e.data);
if (e.data == '4') {
source.close();
}
}
e.preventDefault();
});
點擊一個按鈕。模板中的元素將以 1 秒的間隔顯示“0”到“4”。
但我想在多個類函式中從多個來源顯示。這是我到目前為止所嘗試的,有一個簡化版本,只顯示實際任務的流程,在一個函式中顯示進度并在第一個函式中輸出結果:
class Foo:
def __init__(self):
self.bar = 'foobar'
def f1(self):
i = 3
while i != 0:
self.f2(i)
i -= 1
time.sleep(1)
yield f'data:{self.bar}\n\n'
def f2(self, i):
time.sleep(1)
yield f'data:{self.bar}{i}\n\n'
@app.route('/process', methods=['GET','POST'])
def process():
a = Foo()
return Response(a.f1(), mimetype='text/event-stream')
我對此的期望是元素以 1 秒的間隔顯示“foobar3”、“foobar2”、“foobar1”和“foobar”,但是當我運行它時顯示的是“foobar”,僅此而已。它沒有呼叫f2()。
uj5u.com熱心網友回復:
我猜你想從
def f1(self):
i = 3
while i != 0:
yield from self.f2(i)
i -= 1
time.sleep(1)
yield f'data:{self.bar}\n\n
這真的只是簡寫
def f1(self):
i = 3
while i != 0:
for f2_val in self.f2(i):
yield f2_val
i -= 1
time.sleep(1)
yield f'data:{self.bar}\n\n
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520053.html
標籤:Python烧瓶
下一篇:TypeError:在app.context_processor中使用session["user_id"]時,'NoneType'物件不可迭代
