如果请求中止,则停止处理Flask路由

Cra*_*tch 31 python rest wsgi http flask

我有一个烧瓶REST端点,它执行一些cpu密集型图像处理,并需要几秒钟才能返回.通常,此端点被调用,然后由客户端中止.在这些情况下,我想取消处理.我怎么能在烧瓶中做到这一点?

在node.js中,我会做类似的事情:

req.on('close', function(){
  //some handler
});
Run Code Online (Sandbox Code Playgroud)

我期待烧瓶有类似的东西,或者我可以在处理过程中检查某些点的同步方法(request.isClosed()),如果关闭则返回,但我找不到.

我考虑发送一些东西来测试连接是否仍然打开,如果失败则捕获异常,但似乎Flask缓冲所有输出,因此在处理完成并尝试返回结果之前不会抛出异常:

已建立的连接已由主机中的软件中止

如果客户端中止他们的请求,我怎样才能取消处理中途?

Ale*_*sen 18

你的问题有一个潜在的...... hacky解决方案.Flask能够通过生成器将内容流回用户.hacky部分将流式传输空白数据作为检查以确定连接是否仍然打开,然后当您的内容完成时,生成器可以生成实际图像.您的生成器可以检查处理是否已完成并返回None,""或者如果未完成则返回.

from flask import Response

@app.route('/image')
def generate_large_image():
    def generate():
        while True:
            if not processing_finished():
                yield ""
            else:
                yield get_image()
    return Response(generate(), mimetype='image/jpeg')
Run Code Online (Sandbox Code Playgroud)

我不知道如果客户关闭连接你会得到什么例外,但我愿意打赌它 error: [Errno 32] Broken pipe