如何在烧瓶中产生另一个模板的模板?

时间:2019-04-17 21:57:34

标签: python python-3.x flask

我一直在进行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。我尝试了其他方式,例如将两者都返回,但没有一条起作用。关于如何执行此操作的任何想法?

2 个答案:

答案 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