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()
그게 다야. 이제 가도 좋습니다.
Reference
이 문제에 관하여(FastAPI 스트리밍 응답), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ashraful/fastapi-streaming-response-39c5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)