如何在网页中连续显示python输出?

时间:2013-02-23 14:32:21

标签: python python-2.7 flask jinja2

我希望能够访问网页,它将运行python函数并在网页中显示进度。

因此,当您访问该网页时,您可以看到脚本的输出,就像您从命令行运行它并在命令行中查看输出一样。

我需要在函数中做什么?

我需要在模板中做些什么?

编辑:

我正在尝试使用Markus Unterwaditzer的代码模板。

{% extends "base.html" %}
{% block content %}

{% autoescape false %}

{{word}}

{% endautoescape %}

{% endblock %}

Python代码

import flask
from flask import render_template
import subprocess
import time

app = flask.Flask(__name__)

@app.route('/yield')
def index():
    def inner():
        for x in range(1000):
            yield '%s<br/>\n' % x
            time.sleep(1)
    return render_template('simple.html', word=inner())
    #return flask.Response(inner(), mimetype='text/html')  # text/html is required for most browsers to show the partial page immediately

app.run(debug=True, port=8080)

它运行但我在浏览器中看不到任何内容。

5 个答案:

答案 0 :(得分:14)

这是一个非常简单的应用程序,它使用普通HTTP流式传输进程的输出:

import flask
import time

app = flask.Flask(__name__)

@app.route('/yield')
def index():
    def inner():
        for x in range(100):
            time.sleep(1)
            yield '%s<br/>\n' % x
    return flask.Response(inner(), mimetype='text/html')  # text/html is required for most browsers to show the partial page immediately

app.run(debug=True)

答案 1 :(得分:6)

我今天遇到了同样的问题,并找到了一种方法来改变Markus Unterwaditzer对模板工作的回答。

关键是使用jinja的Template.generate()代替Template.render(),而render_template()使用的是import flask import time from jinja2 import Environment from jinja2.loaders import FileSystemLoader app = flask.Flask(__name__) @app.route('/yield') def index(): def inner(): for x in range(100): time.sleep(1) yield '%s<br/>\n' % x env = Environment(loader=FileSystemLoader('templates')) tmpl = env.get_template('result.html') return flask.Response(tmpl.generate(result=inner())) app.run(debug=True)

result.html

假设有一个模板{% extends "layout.html" %} {% block body %} <body> {% for line in result %} {{ line }} {% endfor %} </body> {% endblock %} ,如下所示:

{{1}}

答案 2 :(得分:3)

我认为最直接的方法是创建页面,然后使用AJAX定期向服务器发出请求,并使用结果更新页面上的内容。这可能包括实施long polling来执行此操作。

无论如何,您都需要以某种方式使您的功能无阻塞,这样您仍然可以在操作时提供请求。如果有一个请求,您可以手动编写一个服务请求的函数,否则继续运行该函数的下一个“块”。这将涉及将您的功能分解为小部分,以便您可以根据需要调度它们。

更好的方法可能是使用线程或多处理,具体取决于您的函数是否受IO或CPU使用限制。

答案 3 :(得分:1)

你有计划使用WebSocket吗?如果是这样,您可以参考:Websocket with Flask and Gevent

答案 4 :(得分:-1)

您可以在其中一个模板中使用元刷新

meta http-equiv =“refresh”content =“5”