javascript - 如何在 Flask 框架中实现服务器发送事件?
问题描述
我正在尝试让进度条在 Flask 中工作。我为此使用服务器发送事件。当我在本地开发服务器中运行它时,一切正常,我可以在浏览器中看到 /progress 窗口中实时添加的数字,进度条没有问题。
但是如果我在 Linux 服务器(Linode)中运行它,那么浏览器窗口会挂起 10 秒,然后进度条会跳转到 100。我是初学者,不明白为什么它可以在本地机器上工作,为什么不能在远程服务器上工作。请有人解释一下。而且 - 这将是一个实用的解决方案。
烧瓶 - app.py
@app.route('/progress')
def progress():
def progress_func():
x = 0
while x < 100:
time.sleep(1)
x = x + 10
yield 'data:' + str(x) + "\n\n"
return Response(progress_func(), mimetype='text/event-stream')
js
var source = new EventSource("/progress");
source.onmessage = function(event) {
$('.progress-bar').css('width', event.data+'%').attr('aria-valuenow', event.data);
};
索引.html
<div>
<div class="progress" style="width: 100%; height: 6px;">
<div class="progress-bar bg-success" role="progressbar" style="width: 6px" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div>
解决方案
以我的经验,这个问题可能是由烧瓶和前端之间的反向代理引起的。
如果您使用 nginx,则需要设置proxy_buffering
为off
才能使用 SSE
编辑:
在查看http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering时,我注意到您可以通过在烧瓶响应中设置X-Accel-Buffering
标头来获得相同的结果。no
此解决方案更好,因为它仅限于此特定响应。