首頁  >  文章  >  後端開發  >  如何在 FastAPI 中有效處理串流響應?

如何在 FastAPI 中有效處理串流響應?

Linda Hamilton
Linda Hamilton原創
2024-11-08 15:54:02367瀏覽

How to Handle Streaming Responses Effectively in FastAPI?

使用 FastAPI 處理串流回應

FastAPI 提供 StreamingResponse 類,用於在 API 呼叫期間將資料串流傳輸到客戶端。雖然此功能旨在以非阻塞方式串流傳輸數據,但在使用具有阻塞操作或不當使用的生成器函數時,可能會出現問題。

增強串流資料回應

確保成功串流傳輸,請考慮以下事項:

  • GET 要求: 使用GET 請求而不是POST 來取得資料。
  • 安全憑證: 避免透過查詢字串傳送憑證;請改用 headers 或 cookies。
  • 非阻塞操作: 如果產生器函數包含阻塞操作,請定義為 def (不是非同步 def)。或者,將 async def 與非同步阻塞操作一起使用。
  • 適當的媒體類型:為回應指定不同的媒體類型(例如application/json 或text/event-stream)而不是文字/plain,或透過將X-Content-Type -Options 標頭設定為nosniff 來停用MIME 嗅探。這可確保瀏覽器不會緩衝回應,從而允許資料即時傳輸。

範例實作

考慮以下Python 程式碼:

# app.py
from fastapi import FastAPI, StreamingResponse
from fastapi.responses import 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')
    # or, use:
    '''
    headers = {'X-Content-Type-Options': 'nosniff'}
    return StreamingResponse(fake_data_streamer(), headers=headers, media_type='text/plain')
    '''

# test.py (using httpx)
import httpx

url = 'http://127.0.0.1:8000/'

with httpx.stream('GET', url) as r:
    for chunk in r.iter_raw():  # or, for line in r.iter_lines():
        print(chunk)

此程式碼示範如何從FastAPI 應用程式中的產生器函數串流傳輸資料並並使用httpx 庫使用它。

以上是如何在 FastAPI 中有效處理串流響應?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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