내 FastAPI StreamingResponse가 생성기 기능을 사용하여 스트리밍하지 못하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-08 12:37:02
원래의
893명이 탐색했습니다.

Why is My FastAPI StreamingResponse Failing to Stream with a Generator Function?

FastAPI StreamingResponse가 생성기 기능을 사용하여 스트리밍하지 못함

FastAPI의 StreamingResponse는 증분적으로 클라이언트에 데이터를 다시 보내는 편리한 방법이지만 가끔은 특히 생성기 기능을 사용할 때 예상대로 작동하지 않을 수 있습니다. 여기서는 잠재적인 원인과 각각의 해결 방법을 살펴보겠습니다.

일반적인 원인 및 해결 방법:

1. 잘못된 HTTP 방법 및 자격 증명 처리:

데이터 검색에 POST 요청을 사용하지 마세요. 대신 GET 요청을 선택하세요. 또한 보안을 강화하고 URL 매개변수 오염을 방지하기 위해 쿼리 매개변수보다는 자격 증명에 헤더나 쿠키를 사용하는 것이 좋습니다.

2. 생성기 함수 내 작업 차단:

생성기 함수에 I/O 또는 CPU 집약적 작업 차단이 포함된 경우 async def 대신 def를 사용하여 잠재적인 교착 상태 및 이벤트 루프 중단을 방지하세요. 또는 async def를 사용하는 경우 별도의 ThreadPool 또는 ProcessPool에서 차단 작업을 실행합니다.

3. 불완전한 줄 바꿈:

요청의 iter_lines()를 사용하여 응답 데이터를 반복하는 경우 응답을 한 줄씩 읽는다는 점을 고려하세요. 데이터가 도착하는 대로 표시되도록 하려면 줄 바꿈을 포함하도록 응답을 수정하거나 지정된 청크 크기로 iter_content()를 사용하십시오.

4. 미디어 유형 및 MIME 스니핑:

브라우저는 콘텐츠 유형을 감지하기 위해 텍스트/일반 응답을 버퍼링할 수 있습니다. 이를 방지하려면 다른 미디어 유형(예: application/json 또는 text/event-stream)을 사용하거나 X-Content-Type-Options 헤더를 nosniff로 설정하여 MIME 스니핑을 비활성화하세요.

예 해결책:

다음은 가짜 데이터를 스트리밍하고 언급된 문제를 해결하는 FastAPI 앱의 실제 구현입니다. 문제:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio

app = FastAPI()

async def fake_data_streamer():
    for i in range(10):
        yield b'some fake data\n\n'
        await asyncio.sleep(0.5)

@app.get('/')
async def main():
    headers = {'X-Content-Type-Options': 'nosniff'}
    return StreamingResponse(fake_data_streamer(), headers=headers, media_type='text/plain')
로그인 후 복사

스트리밍 응답 처리는 클라이언트(웹 브라우저, HTTP 클라이언트 등) 및 해당 기능에 따라 다를 수 있다는 점에 유의하세요.

위 내용은 내 FastAPI StreamingResponse가 생성기 기능을 사용하여 스트리밍하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿