FastAPI StreamingResponse Gagal Menstrim dengan Fungsi Penjana
StreamingResponse FastAPI ialah cara mudah untuk menghantar data kembali kepada pelanggan secara berperingkat, tetapi kadang-kadang ia mungkin tidak berkelakuan seperti yang diharapkan, terutamanya apabila menggunakan fungsi penjana. Di sini, kita akan menyelidiki potensi punca dan penyelesaian masing-masing.
Punca dan Penyelesaian Biasa:
1. Kaedah HTTP dan Pengendalian Kredensial yang Salah:
Elakkan menggunakan permintaan POST untuk mendapatkan data. Sebaliknya, pilih permintaan GET. Selain itu, adalah sangat disyorkan untuk menggunakan pengepala atau kuki untuk bukti kelayakan dan bukannya parameter pertanyaan untuk meningkatkan keselamatan dan mengelakkan pencemaran parameter URL.
2. Operasi Menyekat dalam Fungsi Penjana:
Jika fungsi penjana anda termasuk menyekat operasi I/O atau intensif CPU, gunakan def dan bukannya async def untuk mengelakkan kemungkinan kebuntuan dan gangguan gelung peristiwa. Sebagai alternatif, jika menggunakan async def, laksanakan operasi menyekat dalam ThreadPool atau ProcessPool yang berasingan.
3. Pemisah Baris Tidak Lengkap:
Jika anda menggunakan permintaan' iter_lines() untuk mengulangi data respons, pertimbangkan bahawa ia membaca respons baris demi baris. Untuk memastikan data dipaparkan semasa ia tiba, sama ada ubah suai respons anda untuk memasukkan pemisah baris atau gunakan iter_content() dengan saiz ketulan yang ditentukan.
4. Jenis Media dan Menghidu MIME:
Penyemak imbas mungkin menimbal respons teks/biasa untuk mengesan jenis kandungan. Untuk memintas perkara ini, gunakan jenis media yang berbeza (cth., application/json atau text/event-stream) atau lumpuhkan penghidu MIME dengan menetapkan pengepala X-Content-Type-Options kepada nosniff.
Contoh Penyelesaian:
Di bawah ialah pelaksanaan apl FastAPI yang berfungsi yang menstrim data palsu dan menangani isu yang dinyatakan:
from fastapi import FastAPI 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(): headers = {'X-Content-Type-Options': 'nosniff'} return StreamingResponse(fake_data_streamer(), headers=headers, media_type='text/plain')
Perlu diingat bahawa pengendalian respons penstriman mungkin berbeza-beza bergantung pada klien (penyemak imbas web, klien HTTP, dll.) dan fungsi masing-masing.
Atas ialah kandungan terperinci Mengapa FastAPI StreamingResponse Saya Gagal Menstrim dengan Fungsi Penjana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!