首頁 >後端開發 >Python教學 >為什麼我的 FastAPI StreamingResponse 不能使用生成器函式?

為什麼我的 FastAPI StreamingResponse 不能使用生成器函式?

DDD
DDD原創
2024-11-08 09:51:011019瀏覽

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

StreamingResponse 不使用產生器函數進行串流處理

FastAPI 提供 StreamingResponse 類別來將回應增量傳送回客戶端。然而,在某些情況下,此功能可能無法如預期般運作。

根本原因調查

分析提供的FastAPI 代碼和問題描述後,我們已經確定幾個潛在的原因:

1 。使用POST請求進行資料請求:
使用POST請求不適合從伺服器請求資料。相反,建議使用 GET 請求來實現此目的。

2.使用查詢參數進行驗證:
透過查詢參數發送敏感憑證(例如 auth_key)是不安全的。考慮使用標頭或 cookie 進行身份驗證。

3.阻塞產生器函數:
StreamingResponse 中的生成器函數是使用def(不是非同步def)定義的,這可能會導致FastAPI 事件循環中出現阻塞問題。

4.基於行的分塊:
請求的 iter_lines() 一次迭代一行回應資料。如果回應中不存在換行符,則不會增量列印資料。

5. MIME 嗅探:
某些瀏覽器(例如​​ Chrome)可能會緩衝文字/純文字回應,以便在顯示純文字內容之前檢查它們。這可能會阻礙串流媒體傳輸。

建議修正:

1.使用 GET 要求:
重構程式碼以使用 GET 請求來取得資料。

2.安全驗證:
使用標頭或 cookie 安全地傳送驗證憑證。

3.非同步產生器函數:
使用 async def 定義 StreamingResponse 的產生器函式。如果生成器內需要任何阻塞操作,請使用外部執行緒池來執行它們。

4.基於區塊的分塊:
使用 iter_content() 而不是 iter_lines() 來迭代區塊中的回應資料。指定適當的區塊大小。

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn