【问题标题】:Streaming a flask response that relies on an API call流式传输依赖于 API 调用的烧瓶响应
【发布时间】:2017-03-15 12:46:19
【问题描述】:

我有两个应用程序,一个烧瓶 api(后端)和一个前端应用程序。最近我不得不实现一个流式传输机制,以便前端可以调用 api 来检索一些数据(分页)并将其内容流回。

我按照此处描述的指南,了解如何在Flask 中流回响应。

我在前端的伪代码基本上是这样的:

 return Response(stream_with_context(generate()))

generate() 内我执行以下操作:

def generate():
    # make blocking api call 
    data = requests.get(url)
    for x in data:
        yield x

我发现产生的结果不一致。我的直觉是这与阻塞 API 调用有关。是否可以在生成器中进行阻塞式 api 调用并流回给用户?

【问题讨论】:

    标签: python stream response


    【解决方案1】:

    由于我们正在处理库 requests,您可能应该传入 stream=True 并在响应中使用该生成器。 flask.Response 可以采用字符串可迭代。

    @app.route("/foo")
    def foo():
        _resp = requests.get(url, stream=True)
        _resp.raise_for_status()
    
        resp = Response(
            response=stream_with_context(_resp.iter_content(chunk_size=1024*10)),
            status=200,
            content_type=_resp.headers["Content-Type"],
            direct_passthrough=False)
        return resp
    

    请注意,Content-Type 也是透明代理的。

    要回答您的问题,您是否在生成器中使用阻塞调用并不重要 - 但鉴于您的示例,我不明白您为什么要这样做。

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 2017-12-04
      相关资源
      最近更新 更多