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를 통해 기능을 관리할 것이다.
'FastAPI 개발일지 > 개발하기' 카테고리의 다른 글
FastAPI 개발일지11 - database 연결하기 (4) | 2024.10.15 |
---|---|
FastAPI 개발일지10 - 중간 점검 (0) | 2024.10.10 |
FastAPI 개발일지8 - Path, Query, Request body (3) | 2024.10.03 |
FastAPI 개발일지7 - get, post, put, delete (0) | 2024.09.19 |
FastAPI 개발일지6 - FastAPI 시작하기 (2) | 2024.09.17 |