FastAPI StreamingResponse がジェネレーター関数でストリーミングされない
問題:
FastAPI アプリケーションが失敗しますStreamingResponse を使用してジェネレーター関数からの応答をストリーミングすると、応答全体が次のようになります。全体として送信されます。
回答:
ジェネレーター関数で StreamingResponse を使用する場合、考慮すべき要素がいくつかあります。
1. HTTP リクエスト タイプ:
提供されたコードは POST リクエストを使用していますが、これはサーバーからデータを取得するのには適していません。データを取得するには、代わりに GET リクエストを使用します。
2.資格情報の処理:
セキュリティ上の理由から、URL クエリ文字列を介して資格情報 (「auth_key」など) を送信することは避けてください。代わりにヘッダーまたは Cookie を使用してください。
3.ジェネレーター関数の構文:
StreamingResponse のジェネレーター関数内ではブロック操作を実行しないでください。 FastAPI はスレッド プールを使用してブロック操作を管理するため、ジェネレーター関数には async def の代わりに def を使用します。
4.イテレーターの使用法:
テスト コードでは、requests.iter_lines() は応答データを一度に 1 行ずつ反復処理します。応答に改行が含まれていない場合は、潜在的なバッファリングの問題を回避するために、 iter_content() を使用してチャンク サイズを指定します。
5.メディア タイプ:
ブラウザは、media_type='text/plain' で応答をバッファリングできます。これを回避するには、media_type='text/event-stream' を設定するか、応答ヘッダーの X-Content-Type-Options: nosniff を使用して MIME スニッフィングを無効にします。
作業例:
これは、前述の問題に対処する app.py と test.py の実際の例です。上:
# app.py 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(): headers = {'X-Content-Type-Options': 'nosniff'} # Disable MIME Sniffing return StreamingResponse(fake_data_streamer(), media_type='text/event-stream', headers=headers) # test.py (using httpx) import httpx url = 'http://localhost:8000/' with httpx.stream('GET', url) as r: for chunk in r.iter_content(1024): print(chunk)
以上がFastAPI StreamingResponse がジェネレーター関数でストリーミングされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。