"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo evitar errores de "conexión cerrada" al realizar solicitudes HTTP simultáneas en FastAPI usando Uvicorn?

¿Cómo puedo evitar errores de "conexión cerrada" al realizar solicitudes HTTP simultáneas en FastAPI usando Uvicorn?

Publicado el 2024-12-21
Navegar:799

How Can I Avoid

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.

Último tutorial Más>

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