FastAPI StreamingResponse 未使用生成器函數進行流式處理
問題:
FastAPI應用程式無法使用StreamingResponse 從生成器函數串流傳輸回應,從而導致整個回應作為
答案:
將StreamingResponse 與生成器函數一起使用時需要考慮幾個因素:
1. HTTP請求類型:
提供的程式碼使用POST請求,不適合從伺服器取得資料。使用 GET 請求來取得資料。
2.憑證處理:
出於安全原因,請避免透過 URL 查詢字串傳送憑證(例如「auth_key」)。請改用標頭或 cookie。
3.生成器函數語法:
阻塞操作不應在 StreamingResponse 的生成器函數內執行。對於生成器函數,請使用 def 而不是 async def,因為 FastAPI 使用執行緒池來管理阻塞操作。
4.迭代器用法:
在您的測試程式碼中,requests.iter_lines() 一次一行地迭代回應資料。如果回應不包含換行符,請使用 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中文網其他相關文章!