我正在为小型ML项目开发分析API。我创建了一个端点,它使用Flask的stream_with_context
函数,如下例所示:
def post():
# some logic
[...]
try:
res = get_data_from_elastic()
def generate():
for hit in res:
resp_dict = {
"timestamp": hit.timestamp,
"user_id": hit.user_id,
"node_id": hit.node_id,
"loc": hit.loc,
"is_target": hit.is_target
}
yield json.dumps(resp_dict) + 'n'
return Response(stream_with_context(generate()), status=200, mimetype="application/json")
# except:
# some exception handling
这不是我的代码的精确摘录,但生成器的工作原理是一样的。我使用Python请求连接到API,代码如下:
response = requests.post(analytic_api_url,
headers={'Authorization': token},
data={'since': since,'till': till})
当我连接到API并一次下载少量数据时,一切都很好。不幸的是,当我试图一次下载更多的数据时,我得到了以下错误:
ChunkedEncodingError: ("Connection broken: InvalidChunkLength(got length b'', 0 bytes read)", InvalidChunkLength(got length b'', 0 bytes read))
由于错误是关于chunked encoding
的,我检查了一些事情,比如在服务器的响应中设置Transfer-Encoding: chunked
头,我还尝试使用requests
库中的stream=True
参数——这些解决方案都不起作用。我应该如何处理这个问题?我应该显式设置其他Transfer-Encoding
头,还是为我的API创建另一个生成器?
谢谢你的帮助!
我会把这条评论留给将来偶然发现这个问题的人:"node_id": node_details.id AttributeError: 'NoneType' object has no attribute 'id'
我尝试迭代的一些文档并不完整(由于我收集这些数据的方式(。因此,似乎重点是始终注意数据的完整性。