Maison  >  Article  >  développement back-end  >  Pourquoi ma réponse FastAPI StreamingResponse ne parvient-elle pas à diffuser avec une fonction génératrice ?

Pourquoi ma réponse FastAPI StreamingResponse ne parvient-elle pas à diffuser avec une fonction génératrice ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-08 12:37:02889parcourir

Why is My FastAPI StreamingResponse Failing to Stream with a Generator Function?

FastAPI StreamingResponse ne parvient pas à diffuser avec la fonction générateur

StreamingResponse de FastAPI est un moyen pratique de renvoyer des données à un client de manière incrémentielle, mais il arrive parfois peut ne pas se comporter comme prévu, en particulier lors de l'utilisation des fonctions du générateur. Ici, nous examinerons les causes potentielles et leurs solutions respectives.

Causes et solutions courantes :

1. Méthode HTTP et gestion des informations d'identification incorrectes :

Évitez d'utiliser des requêtes POST pour la récupération de données. Optez plutôt pour les requêtes GET. En outre, il est fortement recommandé d'utiliser des en-têtes ou des cookies pour les informations d'identification plutôt que des paramètres de requête afin de renforcer la sécurité et d'éviter la pollution des paramètres d'URL.

2. Blocage des opérations dans la fonction du générateur :

Si votre fonction de générateur inclut le blocage d'E/S ou d'opérations gourmandes en CPU, utilisez def au lieu de async def pour éviter les blocages potentiels et les interruptions de boucle d'événements. Alternativement, si vous utilisez une définition asynchrone, exécutez des opérations de blocage dans un ThreadPool ou ProcessPool distinct.

3. Sauts de ligne incomplets :

Si vous utilisez les requêtes iter_lines() pour parcourir les données de réponse, considérez qu'il lit les réponses ligne par ligne. Pour garantir que les données sont affichées dès leur arrivée, modifiez votre réponse pour inclure des sauts de ligne ou utilisez iter_content() avec une taille de bloc spécifiée.

4. Type de média et reniflage MIME :

Les navigateurs peuvent mettre en mémoire tampon les réponses texte/plaines pour détecter le type de contenu. Pour contourner ce problème, utilisez un type de média différent (par exemple, application/json ou text/event-stream) ou désactivez le reniflage MIME en définissant l'en-tête X-Content-Type-Options sur nosniff.

Exemple Solution :

Vous trouverez ci-dessous une implémentation fonctionnelle d'une application FastAPI qui diffuse de fausses données et répond aux problèmes mentionnés. problèmes :

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

Gardez à l'esprit que la gestion des réponses en streaming peut varier en fonction du client (navigateurs Web, clients HTTP, etc.) et de leurs fonctionnalités respectives.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn