생성기 기능으로 스트리밍되지 않는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!