FastAPI 개발일지/개발하기

FastAPI 개발일지9 - APIRouter

hccode0419 2024. 10. 5. 16:00

FastAPI를 통해 개발할 때 APIRouter를 사용하여 router를 관리할 수 있다.

 

1. Router

라우터는 FastAPI의 독럽적인 endpoint를 생성하고 관리하는 역할을 한다. 이를 통해 디렉토리 구조를 명확히 하고, 코드의 재사용성을 높일 수 있다.

 

이제부터는 본격으로 쇼핑몰 사이트를 개발하기 위해 디렉토리를 구조화하고 코딩을 할 것이다. 

 

2. 디렉토리 구조

디렉토리를 다음과 같이 구성한 후 프로젝트 개발을 시작하겠다. 

└─project-fastapi
    │  database.py
    │  main.py
    │  models.py
    │  README.md
    │
    ├─history
    │      history_crud.py
    │      history_router.py
    │      history_schema.py
    │
    ├─item
    │      item_crud.py
    │      item_router.py
    │      item_schema.py
    │
    └─user
           user_crud.py
           user_router.py
           user_schema.py

 

먼저 이번 포스트에서는 item만 관리해보겠다.

 

2-1) main.py

from fastapi import FastAPI
from item.item_router import router as item_router

app = FastAPI()

app.include_router(item_router, tags=["item"])

if __name__ == "__main__":
    import uvicorn

    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

 

- item의 router를 불러와서 관리한다.

- app.incude_router를 사용하여 item_router를 불러온 후, tag를 "item"으로 지정하였다.

- 명령어를 작성하지 않고 실행버튼을 클릭하면 uvicorn이 실행되게 변경

 

2-2) item/item_router.py

from fastapi import APIRouter

from .item_schema import create_model

router = APIRouter(
    prefix="/item"
)

items = [
    {"item_id": 1, "item_name":"untoc", "item_price":15000},
    {"item_id": 2, "item_name":"phone", "item_price":35000},
    {"item_id": 3, "item_name":"computer", "item_price":24000},
    {"item_id": 4, "item_name":"pencil", "item_price":1000},
    {"item_id": 5, "item_name":"mouse", "item_price":2000},
    {"item_id": 6, "item_name":"water", "item_price":100}
]

@router.get("/")
def root():
    return {"message":"hello UNTOC"}

@router.get("/get_items")
def get_items(skip:int = 0, limit:int = 10):
    return items[skip : skip + limit]

@router.get("/get_item")
def get_item(item_id:int):
    for item in items:
        if item["item_id"] == item_id:
            return item
    return {"error": "Item not found"}

@router.post("/create_item", response_model=create_model)
def create_itme(item:create_model):
    items.append({"item_id":item.item_id, 
                  "item_name":item.item_name, 
                  "item_price": item.item_price})

    return items[item.item_id - 1]

@router.put("/update_item/{item_id}")
def update_item(item_id: int, item_name: str, item_price: int):
    for item in items:
        if item["item_id"] == item_id:
            item["item_name"] = item_name
            item["item_price"] = item_price
            return item
    
    return {"error": "Item not found"}

@router.delete("/delete_item/{item_id}")
def delete_item(item_id: int):
    for item in items:
        if item["item_id"] == item_id:
            deleted_item = items.pop(item_id-1)
            return {"message": "deleted", "deleted_item":deleted_item}
    return {"error": "Item not found"}

 

- item과 관련된 기능은 해달 파일에서 관리할 것이다.

- item_schema에서 create_model을 들고온 것을 볼 수 있다.

- prefix를 통해 endpoint의 시작점을 설정한다. 

 

2-3) item/item_schema.py

from pydantic import BaseModel

class create_model(BaseModel):
    item_id:int
    item_name: str
    item_price: int

 

- item과 관련된 모든 class 들은 해당 파일에서 관리할 것이다. 

- schema.py에서는 이제부터 입력 양식을 작성할 것이다.

위의 item_router의 create_item 함수의 파라미터를 보면 item: create_model이라고 작성된 것을 볼 수 있다. 

즉 입력양식대로 item을 입력받아 함수를 실행시킨 것이다. 

 

3. FastAPI docs

위와 같이 코드를 변경하면 기존의 기능과 크게 달라진 것은 없지만, router로 관리함으로서 편하게 프로젝트를 개발할 수 있다.

 

FastAPI docs를 통해 변화된 것을 확인해보면 tag를 item으로 설정한 것을 볼 수 있고, endpoint의 시작이 item_router에서 작성한 prefix인 것을 확인할 수 있다.

 

 

이제부터는 각각의 파일에서 router를 통해 기능을 관리할 것이다.