라우트는 HTTP 요청 메서드의 요청을 수락하고 선택적으로 인수를 받을 수 있도록 정의되는데, 특정 라우트로 요청이 전달되면 애플리케이션은 route handler가 요청을 처리하기 전에 해당 라우트가 정의 되어 있는지 확인하다. 핸들러는 서버로 전송된 요청을 처리하는 함수다.
1. FastAPI() 클래스를 사용한 라우팅 처리
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
이렇게 FastAPI() 클래스를 라우팅 작업에 사용할 수는 있지만, 이 방식은 라우팅 중에 단일 경로만 고려하는 애플리케이션으로 일반적으로 사용된다. 고유한 함수를 처리하는 각각의 라우트가 FastAPI() 클래스를 사용하는 경우 애플리케이션은 한번에 여러 라우트를 처리 할 수 없다.
2. APIRouter() 클래스를 사용한 라우팅
from fastapi import APIRouter, Depends, HTTPException
from ..dependencies import get_token_header
router = APIRouter(
prefix="/items",
tags=["items"],
dependencies=[Depends(get_token_header)],
responses={404: {"description": "Not found"}},
)
fake_items_db = {"plumbus": {"name": "Plumbus"}, "gun": {"name": "Portal Gun"}}
@router.get("/")
async def read_items():
return fake_items_db
@router.get("/{item_id}")
async def read_item(item_id: str):
if item_id not in fake_items_db:
raise HTTPException(status_code=404, detail="Item not found")
return {"name": fake_items_db[item_id]["name"], "item_id": item_id}
@router.put(
"/{item_id}",
tags=["custom"],
responses={403: {"description": "Operation forbidden"}},
)
async def update_item(item_id: str):
if item_id != "plumbus":
raise HTTPException(
status_code=403, detail="You can only update the item: plumbus"
)
return {"item_id": item_id, "name": "The great Plumbus"}
APIRouter() 클래스는 FastAPI() 클래스와 동일한 방식으로 작동을 하지만, FastAPI() 클래스와 달리 여러 개의 라우터를 정의하고, 각 라우터는 서로 다른 엔드포인트를 가질 수 있다. 또한 코드를 더 구조화하고 모듈간의 의존성 관리도 쉽기 때문에 좀 더 큰프로젝트에서 유용하고, 코드의 재사용성을 증가시키는 효과가 있다.
from fastapi import Depends, FastAPI
from .dependencies import get_query_token, get_token_header
from .internal import admin
from .routers import items, users
app = FastAPI(dependencies=[Depends(get_query_token)])
app.include_router(users.router)
app.include_router(items.router)
app.include_router(
admin.router,
prefix="/admin",
tags=["admin"],
dependencies=[Depends(get_token_header)],
responses={418: {"description": "I'm a teapot"}},
)
@app.get("/")
async def root():
return {"message": "Hello Bigger Applications!"}
APIRouter() 클래스로 라우터를 정의한 다음 이 모듈을 FastAPI 애플리케이션에도 추가해야 하는데, 이 것은 앤드포인트 및 해당 핸들러 함수를 포함하는 모듈과 같은 개념이기 때문이다. FastAPI 애플리케이션에는 app.include_router 메서드를 사용해서 추가하면 된다.
FastAPI의 incplude_router 메서드는 애플리케이션에 라우터를 추가하는 역할로, 이를 통해 라우터의 엔드 포인트와 핸들러 함수가 FastAPI 애플리케이션에 통합이 된다.
1. include_router 메서드를 호출하면 해당 라우터의 엔드포인트와 핸들러 함수가 FastAPI 애플리케이션에 등록이 되고,
2. FastAPI 애플리케이션의 라우팅 테이블에 새로운 엔드포인트 및 핸들러 함수가 추가가 된다.
3. 요청이 들어오면 FastAPI는 해당 요청의 경로와 라우팅 테이블에서 검색하고, 해당 핸들러 함수를 호출하여 응답을 생성한다
참고 : FastAPI() 애플리케이션과 FastAPI() 클래스의 용어 차이
1. FastAPI() 애플리 케이션 : 실제로 웹 서버를 실행하고 HTTP 요청을 처리하는 애플리케이션으로, FastAPI() 클래스의 인스턴스로 생성되며, 해당 인스턴스가 HTTP 엔드 포인트와 라우팅을 관리한다
2. FastAPI() 클래스 : FastAPI 프레임워크에서 제공하는 클래스로, 이 클래스의 인스턴스를 생성하여 애플리케이션을 구축하고, 이를 FastAPI 애플리케이션이라고 한다
"FastAPI() 애플리케이션"은 FastAPI 클래스의 인스턴스를 가리키며, 이 인스턴스를 사용하여 웹 애플리케이션을 작성하고 실행한다.
'공부하는삶 > MLOps' 카테고리의 다른 글
[TIL] WanDB 시작하기 (0) | 2024.03.26 |
---|---|
로컬 쿠버네티스 환경 설정하기 (1) | 2024.02.21 |
[CS229] Lecture 4 - Perceptron, Exponential Family, GLM, Softmax Regression (0) | 2023.08.29 |
WSL ElasticSearch 8.0 설치 (0) | 2023.08.29 |
Feature Selection (0) | 2023.08.29 |