표준 Python 요청 라이브러리를 사용하여 FastAPI에서 HTTP 요청을 만들 때 동시 요청 중에 스레드 안전이 문제가 됩니다. 이 문제를 효과적으로 해결하려면 스레드 안전성과 향상된 성능을 모두 제공하는 라이브러리인 httpx를 사용하는 것이 좋습니다.
httpx는 비동기 API와 함께 제공되므로 쉽게 다음 작업을 수행할 수 있습니다. 여러 동시 작업을 효율적으로 처리하면서 HTTP 요청을 수행합니다. 다음은 FastAPI 엔드포인트 내에서의 사용 예입니다.
from httpx import AsyncClient from fastapi import FastAPI, Request app = FastAPI() @app.on_event("startup") async def startup_event(): app.state.client = AsyncClient() @app.on_event('shutdown') async def shutdown_event(): await app.state.client.aclose() @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))
이 예에서
async def로 엔드포인트를 정의하는 것을 원하지 않는 경우 httpx의 동기 API를 선택해야 합니다. 이 접근 방식은 스레드 안전성을 유지하고 엔드포인트 구현을 단순화합니다.
from httpx import Client from fastapi import FastAPI, Request app = FastAPI() @app.on_event("startup") def startup_event(): app.state.client = Client() @app.on_event('shutdown') async def shutdown_event(): await app.state.client.aclose() @app.get('/') def home(request: Request): client = request.state.client req = client.build_request('GET', 'https://www.example.com') try: r = client.send(req) content_type = r.headers.get('content-type') except Exception as e: content_type = 'text/plain' e = str(e) if content_type == 'application/json': return r.json() elif content_type == 'text/plain': return PlainTextResponse(content=r.text) else: return Response(content=r.content)
이 예에서 동기 API는 try/exc 블록 내에서 HTTP 요청을 처리하여 요청 중에 발생할 수 있는 모든 예외를 적절하게 처리할 수 있습니다.
httpx와 해당 기능을 활용하면 FastAPI 내에서 자신있게 다운스트림 HTTP 요청을 수행하여 여러 동시 작업을 원활하게 처리하고 애플리케이션 안정성을 보장할 수 있습니다.
위 내용은 httpx는 어떻게 FastAPI에서 안전하고 효율적인 다운스트림 HTTP 요청을 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!