11

我希望能够访问一个网页,它将运行一个 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)

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

4

5 回答 5

16

这是一个非常简单的应用程序,它使用普通 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)
于 2013-02-23T15:45:58.063 回答
10

我今天遇到了同样的问题,并找到了一种方法来调整 Markus Unterwaditzer 的答案以使用模板。

关键是使用 jinja'sTemplate.generate()而不是Template.render()flask's 使用的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 %}
于 2013-05-03T13:16:43.327 回答
3

我认为最直接的方法是创建页面,然后使用 AJAX 定期向服务器发出请求,并使用结果更新页面上的内容。这可能包括实施长轮询来做到这一点。

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

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

于 2013-02-23T15:12:14.973 回答
1

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

于 2013-02-24T01:49:22.027 回答
-1

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

元 http-equiv="刷新" 内容="5"

于 2013-02-23T15:05:58.133 回答