Maison >développement back-end >Tutoriel Python >Comment puis-je enregistrer les corps de requête et de réponse HTTP bruts dans Python FastAPI ?

Comment puis-je enregistrer les corps de requête et de réponse HTTP bruts dans Python FastAPI ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-29 14:00:12542parcourir

How Can I Log Raw HTTP Request and Response Bodies in Python FastAPI?

Consignation des corps de requête/réponse HTTP bruts dans Python FastAPI

Dans Python FastAPI, vous pouvez enregistrer les corps JSON bruts d'une requête/réponse spécifique routes en utilisant un middleware ou des classes APIRoute personnalisées.

Option 1 : Utilisation Middleware

Le middleware vous permet de gérer les demandes et les réponses avant qu'elles ne soient traitées par les points de terminaison. Pour créer un middleware :

@app.middleware("http")
async def middleware(request: Request, call_next):
    # ...
    return await call_next(request)

Utilisez les méthodes request.body() ou request.stream() pour consommer le corps de la requête. Stockez le corps dans une BackgroundTask pour une journalisation ultérieure.

Pour le corps de la réponse, utilisez un code personnalisé pour le lire et le stocker :

res_body = b''
async for chunk in response.body_iterator:
    res_body += chunk

Vous pouvez ensuite enregistrer à la fois les corps de requête et de réponse dans la BackgroundTask pour éviter d'avoir un impact sur le temps de réponse.

Option 2 : Utilisation d'APIRoute personnalisée Classe

Créez une classe APIRoute personnalisée pour gérer les corps de requête et de réponse :

class LoggingRoute(APIRoute):
    # ...
    async def custom_route_handler(request: Request) -> Response:
        # ...
        return response

Dans le gestionnaire de route personnalisé, consommez le corps de la requête et gérez le corps de la réponse de la même manière que l'option 1. En utilisant cette approche, vous pouvez limiter la journalisation à des itinéraires spécifiques à l'aide de . APIRouters.

Considérations

  • Des corps de requête/réponse volumineux (> RAM du serveur) peuvent entraîner des problèmes de mémoire.
  • Les réponses en streaming peuvent rencontrer problèmes ou retards du côté client en raison de la lecture complète de la réponse avant de revenir.
  • Envisagez limites d'utilisation ou stratégies de journalisation alternatives pour les points de terminaison renvoyant des réponses volumineuses ou en continu.

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