Как я могу дать шаблон над другим в колбе? - PullRequest
0 голосов
/ 18 апреля 2019

Я работал над проектом в колбе, и я застрял в одной части, где мне нужно выяснить, как получить один шаблон колбы над другим.

Чтобы проиллюстрировать, что я имею в виду, например, у меня есть такая программа.

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 голосов
/ 19 апреля 2019

Это не ваш случай, но если вы хотите передать шаблон со статическим контентом, вот способ сделать это. Я буду использовать метод 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 %}

См. потоковую передачу из шаблонов в документации.

0 голосов
/ 18 апреля 2019

Вы должны будете работать по-другому, чтобы использовать генератор, подобный этому.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...