새소식

이것저것 개발노트

[FastAPI] [Chapter 8] 라우터

  • -

 

경로 동작 함수는 경로와 동작의 조합이다.

REST API의 엔드포인트와 HTTP 메서드에 각각 대응된다.

 

ToDo 앱을 만들기 위해 라우터에는 다음과 같은 6가지 경로 동작 함수를 정의하게 된다.

- GET /tasks

- POST /tasks

- PUT /tasks/{task_id}

- DELETE /tasks/{task_id}

- PUT /tasks/{task_id}/done

- DELETE /tasks/{task_id}/done

 

6개의 함수를 하나의 파일에 담게 되면, 구현 상태에 따라서 파일 크기가 커져서 

보기 않 좋을 수 있다. 

해당 프로젝트는 처리가 비교적 단순해서 하나의 파일로 묶어도 크게 문제가 되지는 않는다. 

하지만, 함수에 기능을 추가할 때마다 파일 크기가 커지므로 미리 명확하게 분할해 놓아야 더욱 실용적인 설계가 될 수 있다.

 

분할은 리소스 단위로 하는 것을 추천한다. 

 

이번에 ToDo 앱의 경우 크게 

/tasks와 /tasks/{task_id}/done

으로 두개의 리소스로 나눌 수 있으므로 각각을 api/routers/task.py와 api/routers/done.py에 작성한다. 

 

일단 함수의 내용은 pass로 둔다. 이후 그 안에 내용을 채워넣자

 

api/routers/task.py 

from fastapi import APIRouter 

router = APIRouter()

@router.get("/tasks")
async def list_tasks():
    pass 

@router.post("/tasks")
async def create_task():
    pass

@router.put("/tasks/{task_id}")
async def update_task():
    pass

@router.delete("/tasks/{task_id}")
async def delete_task():
    pass

 

 

api/routers/done.py 

from fastapi import APIRouter

router = APIRouter()

@router.put("/tasks/{task_id}/done")
async def mark_task_as_done():
    pass

@router.delete("/tasks/{task_id}/done")
async def unmark_task_as_done():
    pass

 

 

이것으로 routers의 플레이스홀더 준비는 끝났다. 

플레이스홀더: 문자나 이미지등의 요소가 들어갈 자리를 임시로 채워놓은 내용물을 말한다.

 

하지만 이것만으로는 앞서 설명한 Swagger UI에 나타나지 않는다.

위 두 파일로 작성한 router 인스턴스를 FastAPI 인스턴스로 가져와야 한다. 

Hello World!를 작성한 api/main.py를 아래와 같이 다시 작성한다. 

 

app/main.py

from fastapi import FastAPI

from api.routers import task, done

app = FastAPI()

app.include_router(task.router)
app.include_router(done.router)

 

 

 

지금까지의 작업을 통해 Swagger UI가 위 그림처럼 6개의 경로 동작 함수에 해당하는 엔드포인트가 추가되었다.

Docker에 FastAPI 환경을 구축할 때 변경 사항을 즉시 반영하는 핫 리로드 (hot reload) 옵션 (--reload)를 추가했으므로, 파일을 저장하면 Swagger UI를 열었을 때 위와 같이 최신 상태가 반영되어 있을 것이다. 

 

POST /tasks의 경로 동작을 열고 Try it out을 클릭한 뒤 Execute 버튼을 클릭하면 Response body에 null만 반환되는 것을 확인할 수 있다. (빈 함수들만 있기 때문에)

 

 

다음 장에서 스키마를 사용해 정형화 된 값을 채워 응답을 반환하도록 정의해 본다.

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.