在flask中使用stream_with_context时使用generator.send()

时间:2018-07-14 06:11:25

标签: python flask signals generator server-sent-events

用例:加载用户音乐库的应用程序。加载栏显示在前端。使用生成器函数和 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,但是这没有用(如果需要,我可以详细介绍这种方法)。

0 个答案:

没有答案