如何处理Python中的传输编码



我正在为小型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'我尝试迭代的一些文档并不完整(由于我收集这些数据的方式(。因此,似乎重点是始终注意数据的完整性。

最新更新