> 백엔드 개발 > 파이썬 튜토리얼 > 내 FastAPI StreamingResponse가 생성기 함수와 작동하지 않는 이유는 무엇입니까?

내 FastAPI StreamingResponse가 생성기 함수와 작동하지 않는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-08 09:51:01
원래의
1003명이 탐색했습니다.

Why Isn't My FastAPI StreamingResponse Working with a Generator Function?

생성기 기능으로 스트리밍되지 않는 StreamingResponse

FastAPI는 StreamingResponse 클래스를 제공하여 점진적으로 클라이언트에 응답을 보냅니다. 그러나 경우에 따라 이 기능이 예상대로 작동하지 않을 수 있습니다.

근본 원인 조사

제공된 FastAPI 코드와 문제 설명을 분석한 결과, 여러 가지 잠재적인 원인:

1. 데이터 요청 시 POST 요청 사용:
POST 요청 사용은 서버에서 데이터를 요청하는 데 적합하지 않습니다. 대신 GET 요청을 사용하는 것이 좋습니다.

2. 인증을 위한 쿼리 매개변수 사용:
쿼리 매개변수를 통해 auth_key와 같은 민감한 자격 증명을 보내는 것은 안전하지 않습니다. 대신 인증을 위해 헤더나 쿠키를 사용하는 것을 고려해 보세요.

3. 차단 생성기 기능:
StreamingResponse의 생성기 기능은 def(비동기 def 아님)로 정의되어 있어 FastAPI 이벤트 루프 내에서 차단 문제가 발생할 수 있습니다.

4. 줄 기반 청킹:
Requests' iter_lines()는 한 번에 한 줄씩 응답 데이터를 반복합니다. 응답에 줄 바꿈이 없으면 데이터가 증분적으로 인쇄되지 않습니다.

5. MIME 스니핑:
일부 브라우저(예: Chrome)에서는 일반 텍스트 콘텐츠를 표시하기 전에 확인하기 위해 텍스트/일반 응답을 버퍼링할 수 있습니다. 이는 스트리밍을 방해할 수 있습니다.

권장 수정 사항:

1. GET 요청 사용:
데이터 가져오기에 GET 요청을 사용하도록 코드를 리팩터링합니다.

2. 보안 인증:
헤더나 쿠키를 사용하여 인증 정보를 안전하게 전송하세요.

3. 비동기 생성기 기능:
async def를 사용하여 StreamingResponse에 대한 생성기 함수를 정의합니다. 생성기 내에서 차단 작업이 필요한 경우 외부 스레드 풀을 사용하여 실행합니다.

4. 청크 기반 청킹:
iter_lines() 대신 iter_content()를 사용하여 응답 데이터를 청크로 반복합니다. 적절한 청크 크기를 지정하세요.

5. MIME 스니핑 비활성화:
StreamingResponse에 대해 다른 미디어 유형(예: application/json 또는 text/event-stream)을 지정하거나 X-Content-Type-Options 헤더를 nosniff로 설정하여 MIME 스니핑을 비활성화합니다.

작업 예:

다음 코드는 스트리밍 기능을 갖춘 작동하는 FastAPI 앱을 보여줍니다.

from fastapi import FastAPI, 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():
    return StreamingResponse(fake_data_streamer(), media_type='text/event-stream')
로그인 후 복사

위 내용은 내 FastAPI StreamingResponse가 생성기 함수와 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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