如何使用烧瓶将输出流式传输到浏览器
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)
这里我修改了索引视图来处理GET
和POST
两种方法。如果一个简单的 GET
请求出现 returns 带有 result=None
的模板,如果方法是 POST
它 returns=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了解更多
我是 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)
这里我修改了索引视图来处理GET
和POST
两种方法。如果一个简单的 GET
请求出现 returns 带有 result=None
的模板,如果方法是 POST
它 returns=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了解更多