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

Pourquoi ma réponse FastAPI StreamingResponse ne fonctionne-t-elle pas avec une fonction génératrice ?

DDD
DDDoriginal
2024-11-08 09:51:01844parcourir

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

StreamingResponse ne diffuse pas de flux avec la fonction générateur

FastAPI propose la classe StreamingResponse pour renvoyer les réponses aux clients de manière incrémentielle. Cependant, dans certains cas, cette fonctionnalité peut ne pas fonctionner comme prévu.

Enquête sur la cause première

Après avoir analysé le code FastAPI fourni et la description du problème, nous avons identifié plusieurs causes potentielles :

1. Utilisation de la requête POST pour la requête de données :
L'utilisation d'une requête POST n'est pas adaptée pour demander des données à un serveur. Au lieu de cela, il est recommandé d'utiliser une requête GET à cette fin.

2. Utilisation des paramètres de requête pour l'authentification :
L'envoi d'informations d'identification sensibles, telles que auth_key, via des paramètres de requête n'est pas sécurisé. Pensez plutôt à utiliser des en-têtes ou des cookies pour l'authentification.

3. Fonction de générateur de blocage :
La fonction de générateur dans StreamingResponse est définie avec def (et non avec def asynchrone), ce qui peut entraîner des problèmes de blocage dans la boucle d'événements FastAPI.

4. Chunking basé sur les lignes :
Iter_lines() de Requests parcourt les données de réponse une ligne à la fois. Si aucun saut de ligne n'existe dans la réponse, les données ne seront pas imprimées de manière incrémentielle.

5. MIME Sniffing :
Certains navigateurs (par exemple, Chrome) peuvent mettre en mémoire tampon les réponses en texte/en clair pour vérifier le contenu en texte brut avant de les afficher. Cela peut gêner la diffusion en continu.

Corrections recommandées :

1. Utilisez la requête GET :
Refactorisez le code pour utiliser une requête GET pour récupérer des données.

2. Authentification sécurisée :
Utilisez des en-têtes ou des cookies pour envoyer des informations d'authentification en toute sécurité.

3. Fonction de générateur asynchrone :
Définissez la fonction de générateur pour StreamingResponse avec async def. Si des opérations de blocage sont nécessaires au sein du générateur, utilisez un pool de threads externe pour les exécuter.

4. Chunking basé sur des morceaux :
Utilisez iter_content() au lieu de iter_lines() pour parcourir les données de réponse en morceaux. Spécifiez une taille de morceau appropriée.

5. Désactivez le reniflage MIME :
Désactivez le reniflage MIME en spécifiant un type de média différent (par exemple, application/json ou text/event-stream) pour StreamingResponse ou en définissant l'en-tête X-Content-Type-Options sur nosniff.

Exemple de travail :

Ce qui suit le code démontre une application FastAPI fonctionnelle avec une capacité de streaming :

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

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