Класс StreamingResponse
Класс StreamingResponse применяется для отправки данных
клиенту по частям, не загружая весь ответ в память целиком.
Первым параметром передаётся итерируемый объект или асинхронный
генератор, возвращающий байты. Вторым параметром можно указать
тип содержимого media_type. Дополнительно доступны
параметры status_code, headers и background.
Такой ответ удобен для передачи больших файлов, логов
и данных, генерируемых на лету.
Синтаксис
StreamingResponse(content, status_code=200, headers=None, media_type=None, background=None)
Пример
Давайте вернём поток строк через обычный генератор:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
app = FastAPI()
def gen():
for chunk in ['abcde', 'article', 'hello']:
yield chunk.encode('utf-8')
@app.get('/stream')
def stream():
return StreamingResponse(gen(), media_type='text/plain')
Результат выполнения кода для адреса /stream:
"abcdearticlehello"
Пример
Давайте отдадим данные из асинхронного генератора:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio
app = FastAPI()
async def gen():
for chunk in ['user', 'abcde', 'hello']:
yield (chunk + '\n').encode('utf-8')
await asyncio.sleep(0.1)
@app.get('/async-stream')
async def async_stream():
return StreamingResponse(gen(), media_type='text/plain')
Результат выполнения кода для адреса /async-stream:
"user\nabcde\nhello\n"
Смотрите также
-
класс
Response,
который является базовым классом для всех ответов -
класс
FileResponse,
который отдаёт файл с диска потоком -
атрибут
media_type,
который задаёт MIME-тип содержимого ответа -
атрибут
headers,
который хранит заголовки HTTP-ответа