我有一个Quart应用程序,可通过该应用程序将响应流回客户端。我使用asyncio.sleep延迟响应完成,如果我将延迟设置为59秒,则一切正常。流完成没有任何问题。如果我将时间增加到120秒,则响应似乎超时。那是客户端接收到流的第一部分,但是大约60秒后,浏览器在Chrome中抛出一个错误:net :: ERR_HTTP2_PROTOCOL_ERROR200。Firefox抛出了TypeError。
我在Nginx上使用Hypercorn。
hypercorn config.py文件读取:
Shutdown_timeout = 123.0
ssl_handshake_timeout = 123.0
startup_timeout = 123.0
nginx.conf中的相关设置:
location @proxy_to_app {
proxy_read_timout = 600s
}
我不知道该怎么解决。
我找出了问题的根源。它与Quart,Hypercorn或Nginx无关。问题出在Cloudflare和http2上,它是由WriteTimeout引起的。看到这个答案: What's the net::ERR_HTTP2_PROTOCOL_ERROR about?
然后的问题是,如何在Cloudlfare中更改它。
我没有将Quart配置为可在http2中工作,这有帮助吗?
答案 0 :(得分:0)
我发现的唯一解决方案是中断睡眠并向客户端发送临时数据,以保持连接畅通。
async def async_generator():
content_arr = [
json.dumps({'first':'some data'}),
json.dumps({'alive':''}), #required to http2 connection alive
json.dumps({'final' : 'final data'})
]
for i,html in enumerate(content_arr):
print(i)
if i > 0:
await asyncio.sleep(59) #this delays sending the final data 118 seconds
yield html.encode()