Realización de solicitudes HTTP en Uvicorn/FastAPI
Al manejar puntos finales HTTP creados con FastAPI y Uvicorn, es común solicitar datos de API externas. Sin embargo, al tratar con múltiples solicitudes simultáneas, pueden surgir errores como "no se puede manejar el tipo de evento ConexiónCerrada cuando rol=SERVIDOR y estado=SEND_RESPONSE". Esto sucede porque la biblioteca de cliente HTTP predeterminada, 'solicitudes', no es completamente segura para subprocesos cuando se utiliza en un entorno concurrente.
Para resolver este problema, considere implementar la biblioteca de cliente HTTP alternativa llamada httpx. Ofrece una API asíncrona que ayuda a evitar problemas de seguridad de subprocesos dentro de FastAPI. El siguiente ejemplo muestra cómo emplear httpx en FastAPI:
from fastapi import FastAPI, Request, BackgroundTask from fastapi.responses import StreamingResponse, Response from contextlib import asynccontextmanager import httpx @asynccontextmanager async def lifespan(app: FastAPI): async with httpx.AsyncClient() as client: yield {'client': client} app = FastAPI(lifespan=lifespan) @app.get('/') async def home(request: Request): client = request.state.client req = client.build_request('GET', 'https://www.example.com') r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose()))
Al utilizar la API asíncrona de httpx, puede manejar solicitudes HTTP dentro de FastAPI de manera más eficiente mientras mantiene la seguridad de los subprocesos. Puede personalizar aún más el tamaño del grupo de conexiones utilizando el argumento de palabra clave 'límites' en el objeto Cliente.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3