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