Flask 怎么实现 SSE?浏览器断线后会怎样?经过 nginx 要注意什么?这篇用真实的 gunicorn、nginx 与 Chrome 的 EventSource,把线上格式、断线续传与缓冲逐项验证。
状态 200 | Content-Type: text/event-stream; charset=utf-8 | Cache-Control: no-cache | Transfer-Encoding: chunked
响应正文(原样):
'id: 1'
'data: {"n": 1}'
''
'id: 2'
'data: {"n": 2}'
''
'id: 3'
'data: {"n": 3}'
''
': keep-alive comment'
''
''上一篇:长轮询;下一篇:WebSocket 与 Flask-SocketIO。
页面收到的事件(id:数据): ['1:{"n": 1}', '2:{"n": 2}', '3:{"n": 3}', 'onerror(readyState=0)', '4:{"n": 4}', '5:{"n": 5}', '6:{"n": 6}', 'onerror(readyState=0)']
服务端日志里的连接: ['connect Last-Event-ID=None', 'connect Last-Event-ID=3']浏览器是本机的 Google Chrome 无头模式。
没有 X-Accel-Buffering 数据到达的时间点(ms,按 100 ms 以上的间隔分组): [933] 响应头 X-Accel-Buffering: no 数据到达的时间点(ms,按 100 ms 以上的间隔分组): [12, 323, 632, 939]
nginx 是自己起的实例(自签证书),与第 134 篇相同的配置。
8 个 SSE 连接在进行时,/ping 用了 726 ms(每个连接要 1 秒才结束)