我有一个用Python/Flask语言编写的API,它以字典/JSON列表的形式返回数据.它可以返回大量数据,所以我希望它能够将数据传输到客户端.我已经有了生成数据流所需的代码,我只需要弄清楚如何将该数据流提供给客户端.
我希望它是由客户端来决定,如果他们希望的结果流或不,即如果他们不流的响应,他们得到一个有效的列表的直接,但如果他们流的响应,他们会得到每个dict分隔的新行.
到目前为止,我的实现是旧的,基于这个blog post,正如博客更新中指出的,它不是很好:请求数据without streaming会导致一个正确的dict列表,但streaming it会导致一堆几乎可用的dict块.
我已经try 了以下新方法(我稍微简化了这个程序,这里data_generator
迭代地提供了数据)
@app.route("/get_data", methods=["GET"])
def get_data(**kwargs):
def stream_response():
rows = data_generator
for row in rows:
yield json.dumps(row) + "\n"
return Response(stream_response(), mimetype="application/json")
它通过dict工作并传输数据dict,但整个响应(未传输时)不是有效的、可解码的JSON.
是否有一种标准的方法来检测服务器端是客户端请求的数据流还是整个结果,以便在这两种情况下都可以返回有效的数据?我曾考虑过在API中添加一个参数或头,这样客户端就可以指定他们需要什么,但我希望有一个更"通用"的方法.