用例:加载用户音乐库的应用程序。加载栏显示在前端。使用生成器函数和 yield 关键字(使用 stream_with_context 作为响应返回此生成器),将加载的库的比例不断返回到前端。前端使用javascript EventSource 对象查询烧瓶视图。
我想为用户提供一个选项,使其可以通过单击按钮停止加载库(并使用其库的子集)。
代码:
@app.route("/progress", methods=['GET'])
def progress():
gen = get_user_saved_tracks()
return Response(stream_with_context(gen), mimetype= 'text/event-stream')
def get_user_saved_tracks():
for i in range(numtracks):
#load track
yield "data:" + str((float(i+1)/(numtracks))*100) + "\n\n"
yield "data:" + "close" + "\n\n"
建议的方法:
单击按钮停止加载库时,将generator.send()信号发送到get_user_saved_tracks函数。
def get_user_saved_tracks():
for i in range(numtracks):
foo = yield
if foo=='close':
return
#load track
yield "data:" + str((float(i+1)/(numtracks))*100) + "\n\n"
yield "data:" + "close" + "\n\n"
但是,由于我使用的是 stream_with_context ,因此我不确定在哪里进行 gen.send()调用。任何帮助,将不胜感激。我有种预感,这种方法可能行不通。当用户单击“停止加载”到生成器时,我还尝试发送了一个烧瓶signal,但是这没有用(如果需要,我可以详细介绍这种方法)。