我尝试实现"流媒体内容"在我的Pythonanywhere帐户上。
它或多或少看起来在那里显示: 比照http://flask.pocoo.org/docs/0.10/patterns/streaming/
除了我的视图计算一个复杂的过程可能一分钟并将其数据产生到我的模板,其中脚本应该更新一些进度条('' source.onmessage'& #39)。
这适用于我的开发机器,但不适用于我的pythonanywhere帐户。在这个服务器上,进程看起来被卡住了(进度条永远不会更新,除非在最终从0%增长到100%),尽管一切顺利,例如 my { {1}}语句正确呈现到我的服务器日志中)。
在上面引用的代码段中,有一个注释:
请注意,虽然有些WSGI中间件可能会破坏流式传输,但是 在具有分析器和其他东西的调试环境中小心 你可能已经启用了。
这可能是问题吗?会有解决方法吗?
来自我的jinja2模板的JS代码:
print
我的(简化)视图:
<script type="text/javascript">
/* progress bar */
var source = new EventSource("{{ url_for('BP.run', mylongprocess_id=mylongprocess_id) }}");
source.onmessage = function(event) {
console.log(event.data);
var data = event.data.split("!!");
var nodeid = data[0];
var process = data[1];
var process_status = data[2];
var postpro = data[3];
var postpro_status = data[4];
$('.pb1').css('width', process+'%').attr('aria-valuenow', process);
$('.pb2').css('width', postpro+'%').attr('aria-valuenow', process);
document.getElementById("process_status").innerHTML = process_status;
document.getElementById("postpro_status").innerHTML = postpro_status;
document.getElementById("nodeid").innerHTML = nodeid;
if (postpro >= 100) {
setTimeout(function() {
console.log("progress is finished!");
document.getElementById("status").innerHTML = "redirecting to {{url_for('.view_sonix_result', mylongprocess_id=mylongprocess_id)}}";
window.location.replace("{{url_for('.terminate_analysis', mylongprocess_id=mylongprocess_id)}}");
}, 2); // / setTimeout function
} // /if
else {
document.getElementById("status").innerHTML = "pending...";
} // /else
} // /function
</script>
答案 0 :(得分:4)
当流量在PythonAnywhere上托管时,您的流量将通过nginx代理,nginx会缓冲响应,除非另有说明。
要让所有东西都冲洗,
response.headers['X-Accel-Buffering'] = 'no'
'\n'
,因为python也会缓冲到行尾。