2015-05-13 34 views
4

我尝试在我的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') 

回答

4

你的流量都经过Nginx上的代理时,它托管在PythonAnywhere和nginx的缓存,除非响应另有规定。

把一切刷新,

  1. 给你瓶回应头response.headers['X-Accel-Buffering'] = 'no'
  2. '\n'你的收益率在字符串的结尾,因为蟒蛇还缓冲,直到行尾。
相关问题