flask - 如何将(产生)文本数据流式传输到 pythonanywhere 上的 flask 应用程序的 jinja2 模板

标签 flask wsgi pythonanywhere

我尝试在我的 Pythonanywhere 帐户上实现“流媒体内容”。

它或多或少看起来像那里显示的内容:
参见http://flask.pocoo.org/docs/0.10/patterns/streaming/

除了我的 View 正在计算一个可能一分钟的复杂过程并将其数据生成到我的模板,其中脚本应该更新一些进度条(“source.onmessage”)。

这在我的开发机器上完美运行,但不适用于我的 pythonanywhere 帐户。在这台服务器上,进程看起来很卡(进度条永远不会更新,除非在最后突然从 0% 增长到 100%),尽管一切都在后台进行,例如我的 print语句正确呈现到我的服务器日志中)。

在上面引用的片段中,有一个注释:

Note though that some WSGI middlewares might break streaming, so be careful there in debug environments with profilers and other things you might have enabled.



可能是这里的问题吗?会有解决方法吗?

我的 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>

我的(简化) View :
@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')

最佳答案

当您的流量托管在 PythonAnywhere 上时,您的流量会通过 nginx 代理,除非另有说明,否则 nginx 会缓冲响应。

为了让一切都冲洗干净,

  • 给你的 flask 响应标题response.headers['X-Accel-Buffering'] = 'no'
  • 有一个 '\n'在您正在生成的字符串的末尾,因为 python 也会缓冲到行尾。
  • 关于flask - 如何将(产生)文本数据流式传输到 pythonanywhere 上的 flask 应用程序的 jinja2 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30210744/

    相关文章:

    flask - 如何提供博客摘录而不必使用 Jinja2 模板显示 html 代码?

    python - flask +uwsgi+nginx : When is memory released?

    mysql - 在 pythonanywhere 上备份 mysql 数据库

    python - 我的 Flask-Admin ModelView 的 __init__ 没有应用程序上下文——它通常什么时候获得一个?

    python - 将 python isapi-wsgi 模块分配给 iis 7.5 web 子应用程序

    python - Django 源代码不会在服务器上更新

    python - 除了 celery 之外,django/wsgi 中的后台 worker 、异步延迟任务队列还有什么选择?

    python - 在 Web2py 中访问安装在 Pythonanywhere 上的模块

    Django - 删除 HTTPS 重定向

    python - 通过 uWSGI 时 Flask debug=True 不起作用