Функция stream_with_context
Функция stream_with_context применяется для оборачивания генератора, который возвращает потоковые данные. По умолчанию, когда Flask начинает отправлять ответ клиенту, контекст запроса уничтожается. Если внутри генератора необходимо обратиться к объектам request, session или g, без этой функции возникнет ошибка. Функция принимает один аргумент - генератор или итерируемый объект, и возвращает обёртку, сохраняющую контекст на время выполнения итерации.
Синтаксис
from flask import stream_with_context
stream_with_context(generator)
Пример
Давайте создадим маршрут, который возвращает поток данных и использует объект request внутри генератора:
from flask import Flask, stream_with_context, request, Response
app = Flask(__name__)
@app.route('/stream')
def stream():
@stream_with_context
def generate():
for i in range(5):
yield f'data: {i} - path: {request.path}\n'
return Response(generate(), mimetype='text/plain')
Результат выполнения кода для адреса /stream:
Пример
Давайте используем функцию как обёртку для генератора, который читает данные из session:
from flask import Flask, stream_with_context, session, Response
app = Flask(__name__)
app.secret_key = 'secret'
@app.route('/set')
def set_session():
session['user'] = 'abcde'
return 'session set'
@app.route('/get')
def get_stream():
def generate():
for i in range(3):
yield f'{session.get("user", "guest")} - {i}\n'
return Response(stream_with_context(generate()), mimetype='text/plain')
Результат выполнения кода для адреса /get после посещения /set:
Смотрите также
-
функцию
jsonify,
которая создаёт JSON-ответ -
функцию
make_response,
которая создаёт объект ответа -
функцию
copy_current_request_context,
которая копирует контекст запроса для использования в другом потоке -
функцию
after_this_request,
которая выполняет код после завершения текущего запроса