본문 바로가기

Programming/[Python]

[FastAPI] 2. 라우팅(Routing)

반응형

참고 도서

 

개발환경 : WSL2 (Ubuntu 20.04), Python 3.10 (anaconda 가상환경)

 

라우팅(Routing)

  • 웹 애플리케이션을 구축하는 데 있어 핵심적인 부분
  • 클라이언트가 서버로 보내는 HTTP 요청을 처리하는 프로세스
  • HTTP 요청이 지정한 라우트로 전송되면 미리 정의된 로직이 해당 요청을 처리해서 반환(응답)

이번 포스팅에서는 여러 함수를 사용하는 연속적인 라우트 처리를  FastAPI 클래스를 통해 구현해보자.

 

APIRouter 클래스를 사용한 라우팅

APIRouter 클래스는 다중 라우팅을 위한 경로 처리 클래스로, fastapi 패키지에 포함돼있음.

라우팅 메서드는 다음과 같이 APIRouter() 인스턴스를 사용해 생성한다. todo.py라는 새로운 파일을 작성

from fastapi import APIRouter

todo_router = APIRouter()

todo_list = []

@todo_router.post("/todo")
async def add_todo(todo: dict) -> dict:
    todo_list.append(todo)
    return {
        "메시지" : "Todo가 추가되었습니다."
    }

@todo_router.get("/todo")
async def retrieve_todos() -> dict:
    return {
        "todo" : todo_list
    }

todo.py는 앱 내부 데이터베이스를 임시로 만들고 todos를 생성 및 추출하는 라우트를 정의함.

  • 이 코드는 todo 처리를 위해 두 개의 라우트를 추가
  • 첫 번째 라우트는 todo_list에 todo를 추가하는 POST 메서드
  • 두 번째 라우트는 모든 todo 아이템을 todo_list에서 조회하는 GET 메서드

이제 이 애플리케이션을 서버에서 실행한 다음 제대로 작동하는지 테스트해보자.

기존에 작성한 api.py 파일에 다음과 같이 추가작성한 뒤 터미널에서 애플리케이션을 실행

from fastapi import FastAPI
from todo import todo_router	# 추가

app = FastAPI()

@app.get("/")
async def welcome() -> dict:
    return {
        "message" : "안녕, 공부 열심히 하렴"
    }

app.include_router(todo_router)	# 추가
uvicorn api:app --port 8000 --reload

 

터미널 창을 하나 더 띄우고 curl로 GET요청을 전송해 애플리케이션이 제대로 실행되는 지 테스트함.

curl http://127.0.0.1:8000/ # 입력

#결과
{"message":"안녕, 공부 열심히 하렴"}

 

다음은 todo 라우트가 제대로 실행되는 지 확인함.

 

Linux

curl -X 'GET' 'http://127.0.0.1:8000/todo' -H 'accept: application/json'

# 결과
{"todo":[]}

Windows

curl -X GET http://127.0.0.1:8000/todo -H "accept: application/json"

# 결과
{"todo":[]}

 

todo 라우트가 실행되는 것을 확인했으면 POST 요청을 전달해서 아이템을 todo_list에 추가해보자.

 

Linux

curl -X 'POST' \
'http://127.0.0.1:8000/todo' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"id" : 1,
"item" : "첫 아이템 추가"
}'

# 결과
{"메시지":"Todo가 추가되었습니다."}

Windows

윈도우에서는 다음과 같이 큰따옴표를 사용, 큰따옴표 안의 큰따옴표는 \를 사용해 이스케이프 처리해야함.

curl -X POST http://127.0.0.1:8000/todo -H "accept: application/json" -H "Content-Type: application/json" -d "{\"id\":1, \"item\":\"첫 아이템 추가\"}"

# 결과
{"메시지":"Todo가 추가되었습니다."}

 

반응형