我一直在进行Flask的一个项目,我被困在一个零件上,在那里我需要弄清楚如何在另一个烧瓶上生成一个Flask模板。
例如,为了说明我的意思,我有一个这样的程序。
main.py
from flask import Flask, stream_with_context, Response, render_template
app = Flask('app')
@app.route('/')
def hello_world():
def generate():
yield render_template('index.html')
yield render_template('index2.html')
return Response(stream_with_context(generate()))
app.run(host='0.0.0.0', port=8080)
index.html
<h3>Hi</h3>
index2.html
<h3>Bye</h3>
运行main.py返回:
Hi
Bye
尽管这很有意义,但我的目标是使它只产生Bye
,而应该替换Hi
。我尝试了其他方式,例如将两者都返回,但没有一条起作用。关于如何执行此操作的任何想法?
答案 0 :(得分:0)
要使用这样的生成器,您将不得不执行其他功能。
from flask import Flask, stream_with_context, Response, render_template
app = Flask('app')
def page_generator():
yield render_template('index.html')
yield render_template('index2.html')
generator_obj = None
@app.route('/')
def hello_world():
global generator_obj
generator_obj = generator_obj or page_generator()
return Response(stream_with_context(next(generator_obj)))
app.run(host='0.0.0.0', port=8080)
我不确定这是否可以在烧瓶中使用。
请注意,两次调用hello_world
后,除非您在generator_obj
上将None
重置为StopIteration
,否则此操作将失败。
答案 1 :(得分:0)
这不是您的情况,但是如果您想流式传输带有静态内容的模板,则可以采用以下方法。我将使用sleep()
方法将执行暂停1秒钟。
from flask import Flask, stream_with_context, request, Response, flash
import time
from time import sleep
app = Flask(__name__)
def stream_template(template_name, **context):
app.update_template_context(context)
t = app.jinja_env.get_template(template_name)
rv = t.stream(context)
rv.disable_buffering()
return rv
data = ['Hi', 'Bye']
def generate():
for item in data:
yield str(item)
sleep(1)
@app.route('/')
def stream_view():
rows = generate()
return Response(stream_with_context(stream_template('index.html', rows=rows)))
if __name__ == "__main__":
app.run()
其中 templates / index.html :
{% for item in rows %}
<h1>{{ item }}</h1>
{% endfor %}
请参阅文档中的streaming from templates。