如何使用flask将输出流式传输到浏览器中

时间:2017-12-02 09:52:51

标签: python flask jinja2 yield

我是新手。我有代码将输出流式传输到浏览器。对于我的下面的代码,我需要从浏览器输入范围值并显示计数直到范围。提前谢谢。

import flask
import time

from jinja2 import Environment
from jinja2.loaders import FileSystemLoader

app = flask.Flask(__name__)

@app.route('/')
def index():
    def inner():
        for x in range(100):# eg: 100 should input value from browser 
            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
<html>
{% block body %}
<body>
  {% for line in result %}
    {{ line }}
  {% endfor %}
</body>
{% endblock %}
</html>

1 个答案:

答案 0 :(得分:1)

以下是您要做的事情的答案。

我已将您的应用代码修改为:

import flask
import time

from flask import request
from jinja2 import Environment
from jinja2.loaders import FileSystemLoader

app = flask.Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    result = None
    if request.method == 'POST':
        counter = int(request.form.get('counter', 0))
        def inner():
            for x in range(counter):# eg: 100 should input value from browser 
                time.sleep(1)
                yield '%s<br/>\n' % x
        result = inner
    env = Environment(loader=FileSystemLoader('templates'))
    tmpl = env.get_template('result.html')
    return flask.Response(tmpl.generate(result=result if result is None else result()))

app.run(debug=True)

这里我修改了索引视图以处理GETPOST方法。如果有简单的GET请求,则返回带有result=None的模板,如果方法为POST则返回returns=result()(我在POST块中指定了result = inner)。处理None或值的逻辑在模板中处理。

您的模板需要更改为:

<html>
{% block body %}
<body>
{% if result%}
  {% for line in result %}
    {{ line }}
  {% endfor %}
{% else %}
    <form method="post">
        <input type="text" placeholder="Enter a number" name="counter">
        <input type="submit" value="Submit">
    </form>
{% endif %}
</body>
{% endblock %}
</html>

我添加了if-else条件,因为您使用相同的模板,甚至URL也不会更改。

您可以关注Flask Quickstart Tutorial了解详情