Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa FastAPI StreamingResponse saya tidak menstrim dengan fungsi penjana?

Mengapa FastAPI StreamingResponse saya tidak menstrim dengan fungsi penjana?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-10 02:55:02836semak imbas

Why is my FastAPI StreamingResponse not streaming with a generator function?

FastAPI StreamingResponse Tidak Menstrim dengan Fungsi Penjana

Masalah:

Aplikasi FastAPI gagal strim respons daripada fungsi penjana menggunakan StreamingResponse, menyebabkan keseluruhan respons dihantar secara keseluruhan.

Jawapan:

Terdapat beberapa faktor yang perlu dipertimbangkan semasa menggunakan StreamingResponse dengan fungsi penjana:

1. Jenis Permintaan HTTP:

Kod yang disediakan menggunakan permintaan POST, yang tidak sesuai untuk mendapatkan data daripada pelayan. Sebaliknya, gunakan permintaan GET untuk mengambil data.

2. Pengendalian Bukti Kelayakan:

Atas sebab keselamatan, elakkan menghantar bukti kelayakan (cth., 'auth_key') melalui rentetan pertanyaan URL. Gunakan pengepala atau kuki sebaliknya.

3. Sintaks Fungsi Penjana:

Operasi penyekatan tidak boleh dilaksanakan dalam fungsi penjana StreamingResponse. Gunakan def dan bukannya async def untuk fungsi penjana, kerana FastAPI menggunakan kumpulan benang untuk mengurus operasi penyekatan.

4. Penggunaan Iterator:

Dalam kod ujian anda, requests.iter_lines() berulang melalui data respons satu baris pada satu masa. Jika respons tidak mengandungi pemisah baris, gunakan iter_content() dan nyatakan saiz ketulan untuk mengelakkan masalah penimbalan yang berpotensi.

5. Jenis Media:

Pelayar boleh menimbal respons dengan media_type='text/plain'. Untuk mengelakkan ini, tetapkan media_type='text/event-stream' atau lumpuhkan MIME Sniffing menggunakan X-Content-Type-Options: nosniff dalam pengepala respons.

Contoh Berfungsi:

Berikut ialah contoh yang berfungsi dalam app.py dan test.py yang menangani isu yang dinyatakan di atas:

# 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)

Atas ialah kandungan terperinci Mengapa FastAPI StreamingResponse saya tidak menstrim dengan fungsi penjana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn