首頁 >後端開發 >Python教學 >為什麼我的 FastAPI StreamingResponse 不使用生成器函數進行串流?

為什麼我的 FastAPI StreamingResponse 不使用生成器函數進行串流?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-10 02:55:02829瀏覽

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 的生成器函數內執行。對於生成器函數,請使用 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中文網其他相關文章!

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