如何使用烧瓶将输出流式传输到浏览器

How to stream the output into browser using flask

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

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>

这是做你想做的事情的答案。

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

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 请求出现 returns 带有 result=None 的模板,如果方法是 POSTreturns=result()(我已经在 [=32 中分配了 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了解更多