Fazendo solicitações HTTP em Uvicorn/FastAPI
Ao lidar com endpoints HTTP criados usando FastAPI e Uvicorn, é comum solicitar dados de APIs externas. No entanto, ao lidar com diversas solicitações simultâneas, podem surgir erros como "não é possível manipular o tipo de evento ConnectionClosed quando role=SERVER e state=SEND_RESPONSE". Isso acontece porque a biblioteca cliente HTTP padrão, 'solicitações', não é totalmente segura para threads quando utilizada em um ambiente simultâneo.
Para resolver esse problema, considere implementar a biblioteca cliente HTTP alternativa chamada httpx. Ele oferece uma API assíncrona que ajuda a evitar problemas de segurança de thread no FastAPI. O exemplo abaixo mostra como empregar httpx no 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()))
Ao utilizar a API assíncrona do httpx, você pode lidar com solicitações HTTP dentro do FastAPI com mais eficiência, mantendo a segurança do thread. Você pode personalizar ainda mais o tamanho do pool de conexões usando o argumento de palavra-chave 'limits' no objeto Cliente.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3