我尝试在我的Pythonanywhere帐户上实现“流式内容”。如何在pythonanywhere中将文本数据流式传输到jinja2模板上
它看起来或多或少地显示了那里: cf. http://flask.pocoo.org/docs/0.10/patterns/streaming/
除了我的观点是计算一个复杂的过程可能一分钟,并产生其数据到我的模板,脚本应该更新一些进度条(''source.onmessage'')。
这在我的开发机器上完美工作,但不在我的pythonanywhere帐户。在此服务器上,该进程看起来是卡住的(进度条从未更新,除非在从0%增加到100%的最后端),尽管一切顺利进行,例如,例如。我的print
语句正确地呈现到我的服务器日志中)。
在上面引述的片断,还有一张纸条:
不过,请注意一些WSGI中间件可能打破流,所以要 小心有与剖析和 你可能已经启用了其他的事情调试环境。
难道这是问题吗?并会有一个解决方法?
从我的Jinja2模板JS代码:
<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>
我(简化)的观点:
@BP.route('/run/<int:mylongprocess_id>')
@login_required
def run(mylongprocess_id):
mylongprocess = mylongprocess.query.get_or_404(mylongprocess_id)
project = Project.query.get_or_404(mylongprocess.project_id)
check_rights(current_user, project, 'user', 404)
A, lcs = _create_analysis(mylongprocess)
@copy_current_request_context
def gen(mylongprocess, nodeid, store_path):
print('now runing %s' % A)
for (loopnb, total_loops, pct, lclabel) in A.runiterator(lcs):
print('ran %d/%d (%.1f%%) "%s"' % (loopnb, total_loops,
pct, lclabel))
progress = ('data: %s!!%f!!%s!!%f!!%s\n\n' %
(nodeid, pct, lclabel, 0, 'waiting...'))
yield progress
print('now postprocessing %s' % A)
postpro = load_node(store_path, node_id=nodeid)
for step, total, pct, action in postpro._builditer(target='web',
buildfile=None):
progress = ('data: %s!!%f!!%s!!%f!!%s\n\n' %
(nodeid, 100, 'ok', pct, action.replace('_', ' ')))
yield progress
print('now terminating %s' % A)
_terminate_analysis(A, mylongprocess)
return Response(gen(mylongprocess, mylongprocess.nodeid), mimetype='text/event-stream')