ホームページ  >  記事  >  バックエンド開発  >  FastAPI StreamingResponse がジェネレーター関数でストリーミングされないのはなぜですか?

FastAPI StreamingResponse がジェネレーター関数でストリーミングされないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-10 02:55:02779ブラウズ

Why is my FastAPI StreamingResponse not streaming with a generator function?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。