FastAPI 스트리밍 응답

스트리밍 응답이란 무엇입니까?



스트리밍 응답은 기본적으로 데이터를 스트리밍합니다. 그래서, 어떻게 이런 일이?? 충분한 양의 데이터가 있다고 가정해 보겠습니다. 예를 들어 10MB의 텍스트 데이터입니다. API를 통해 데이터를 어떻게 전송합니까? 서버에서 이러한 데이터를 다운로드하는 데 시간 초과, 기타 네트워크 문제가 발생할 수 있습니다. 따라서 문제를 해결하기 위해 스트리밍 응답이 우선입니다.

어떻게 작동합니까?



정말 간단합니다. 다운로더가 어떻게 작동하는지 생각해보세요. 따라서 Streaming 응답은 다음과 같습니다. 10MB가 청크별로 다운로드됩니다. 전문 용어로는 멀티파트(multipart)라고 합니다.

FastAPI의 스트리밍 응답




from typing import Generator
from starlette.responses import StreamingResponse
from fastapi import status, HTTPException

# A simple method to open the file and get the data
def get_data_from_file(file_path: str) -> Generator:
    with open(file=file_path, mode="rb") as file_like:
        yield file_like.read()

# Now response the API
async def get_image_file(path: str):
    try:
        file_contents = get_image_from_file(file_path=path)
        response = StreamingResponse(
            content=file_contents,
            status_code=status.HTTP_200_OK,
            media_type="text/html",
        )
        return response
    except FileNotFoundError:
        raise HTTPException(detail="File not found.", status_code=status.HTTP_404_NOT_FOUND)


함수get_image_file를 사용하기만 하면 원하는 스트리밍 응답을 얻을 수 있습니다.

내가 왜 그것에 대해 쓰고 있습니까?



반전이 있기 때문입니다. Starlette(FastAPI의 어머니)는 비동기 생성기에 대한 버그를 발견했습니다. FastAPI의 문제를 해결하기 위해 다른 문제가 발생했습니다. 동기화 생성기를 사용하여 파일을 제공하거나 응답을 스트리밍할 때 정말 느리기 때문입니다.
Bug link here .

이야기의 교훈 우리는 API를 제공/스트리밍하기 위해 비동기 생성기를 사용해야 합니다. 구현은 여기,

from typing import Generator

# Just use the async function you already have. :)
async def get_data_from_file(file_path: str) -> Generator:
    with open(file=file_path, mode="rb") as file_like:
        yield file_like.read()



그게 다야. 이제 가도 좋습니다.

좋은 웹페이지 즐겨찾기