알림 전송을 위해 설계된 사용자 정의 클래스를 고려해보세요. 초기화에는 알림 서버에 대한 연결 설정이 포함되며 이는 시간이 많이 걸리는 프로세스입니다. 이 클래스는 엔드포인트 응답 지연을 방지하기 위해 FastAPI의 백그라운드 작업 내에서 활용됩니다. 그러나 현재 접근 방식에는 다음과 같은 제한 사항이 있습니다.
file1.py: noticlient = NotificationClient() @app.post("/{data}") def send_msg(somemsg: str, background_tasks: BackgroundTasks): result = add_some_tasks(data, background_tasks, noticlient) return result file2.py: def add_some_tasks(data, background_tasks: BackgroundTasks, noticlient): background_tasks.add_task(noticlient.send, param1, param2) result = some_operation return result
file1.py의 전역 알림 클라이언트 초기화로 인해 요청이 수신될 때마다 여러 중복 초기화가 발생하므로 이는 비효율적입니다.
옵션 1: 활용 app.state
FastAPI를 사용하면 app.state를 사용하여 임의의 상태를 저장할 수 있습니다. 수명과 같은 종속성 수명 주기 기능을 사용하여 FastAPI 시작 또는 종료 중에 NotificationClient 객체를 초기화하고 이를 app.state에 추가할 수 있습니다.
from fastapi import FastAPI, Request from contextlib import asynccontextmanager @asynccontextmanager async def lifespan(app: FastAPI): ''' Run at startup Initialise the Client and add it to app.state ''' app.state.n_client = NotificationClient() yield ''' Run on shutdown Close the connection Clear variables and release the resources ''' app.state.n_client.close() app = FastAPI(lifespan=lifespan) @app.get('/') async def main(request: Request): n_client = request.app.state.n_client # ...
옵션 2: Starlette 수명 활용
Starlette의 수명 핸들러를 사용하면 다음을 통해 엔드포인트 내에서 액세스할 수 있는 상태 개체를 정의할 수 있습니다. request.state.
from fastapi import FastAPI, Request from contextlib import asynccontextmanager @asynccontextmanager async def lifespan(app: FastAPI): ''' Run at startup Initialise the Client and add it to request.state ''' n_client = NotificationClient() yield {'n_client': n_client} ''' Run on shutdown Close the connection Clear variables and release the resources ''' n_client.close() app = FastAPI(lifespan=lifespan) @app.get('/') async def main(request: Request): n_client = request.state.n_client # ...
위 내용은 FastAPI 엔드포인트에서 전역 개체를 효율적으로 초기화하고 재사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!