Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa FastAPI StreamingResponse Saya Tidak Berfungsi dengan Fungsi Penjana?

Mengapa FastAPI StreamingResponse Saya Tidak Berfungsi dengan Fungsi Penjana?

DDD
DDDasal
2024-11-08 09:51:01932semak imbas

Why Isn't My FastAPI StreamingResponse Working with a Generator Function?

StreamingResponse Bukan Penstriman dengan Fungsi Penjana

FastAPI menawarkan kelas StreamingResponse untuk menghantar respons kembali kepada pelanggan secara berperingkat. Walau bagaimanapun, dalam sesetengah kes, fungsi ini mungkin tidak berfungsi seperti yang dijangkakan.

Penyiasatan Punca Punca

Selepas menganalisis kod FastAPI yang disediakan dan penerangan isu, kami telah mengenal pasti beberapa punca yang berpotensi:

1. Penggunaan POST Request for Data Request:
Penggunaan POST request tidak sesuai untuk meminta data daripada pelayan. Sebaliknya, adalah disyorkan untuk menggunakan permintaan GET untuk tujuan ini.

2. Penggunaan Parameter Pertanyaan untuk Pengesahan:
Menghantar bukti kelayakan sensitif, seperti auth_key, melalui parameter pertanyaan adalah tidak selamat. Pertimbangkan untuk menggunakan pengepala atau kuki untuk pengesahan sebaliknya.

3. Fungsi Penjana Menyekat:
Fungsi penjana dalam StreamingResponse ditakrifkan dengan def (bukan def async), yang boleh membawa kepada isu penyekatan dalam gelung acara FastAPI.

4. Pecahan berasaskan baris:
Iter_lines() Permintaan berulang pada data respons satu baris pada satu masa. Jika tiada pemisah baris wujud dalam respons, data tidak akan dicetak secara berperingkat.

5. Menghidu MIME:
Sesetengah penyemak imbas (cth., Chrome) mungkin menimbal respons teks/biasa untuk menyemak kandungan teks biasa sebelum memaparkannya. Ini boleh menghalang penstriman.

Pembetulan Disyorkan:

1. Gunakan Permintaan GET:
Faktor semula kod untuk menggunakan permintaan GET untuk mengambil data.

2. Pengesahan Selamat:
Gunakan pengepala atau kuki untuk menghantar bukti kelayakan pengesahan dengan selamat.

3. Fungsi Penjana Async:
Tentukan fungsi penjana untuk StreamingResponse dengan async def. Jika sebarang operasi menyekat diperlukan dalam penjana, gunakan kumpulan benang luaran untuk melaksanakannya.

4. Chunking berasaskan ketulan:
Gunakan iter_content() dan bukannya iter_lines() untuk mengulangi data tindak balas dalam ketulan. Nyatakan saiz bongkah yang sesuai.

5. Lumpuhkan MIME Sniffing:
Lumpuhkan MIME Sniffing dengan menentukan jenis media yang berbeza (cth., application/json atau teks/event-strim) untuk StreamingResponse atau dengan menetapkan pengepala X-Content-Type-Options kepada nosniff.

Bekerja Contoh:

Kod berikut menunjukkan apl FastAPI yang berfungsi dengan keupayaan penstriman:

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

Atas ialah kandungan terperinci Mengapa FastAPI StreamingResponse Saya Tidak Berfungsi 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