WeniVooks

검색

FastAPI 베이스캠프

매개변수 라우팅

1. 라우팅 및 세팅

1.1 URL 정보

이번 챕터의 URL 구성은 아래와 같습니다.

경로 함수명 설명
/ index 인사말을 반환합니다.
/blog blog_list 블로그 목록을 반환합니다.
/blog/{post_id} blog_detail 블로그 상세 정보를 반환합니다.
/blog/{post_tag} tag_list {post_tag} 태그를 가지고 있는 게시글을 반환합니다.
/blog/{post_tag}/{post_author}/ tag_author_list {post_tag} 태그 게시물 중, 저자가 {post_author}인 것을 조회합니다.
1.2 기본 세팅

이번에도 새로운 폴더를 만들어서 진행하겠습니다. 이번 실습 폴더는 02_2_param입니다. VSC 터미널에서 사용할 명령어 입니다. 가상환경은 벗어난 상태에서 실행해야 합니다. 만약 터미널 입력창 앞에 (venv)라고 되어 있다면 deactivate 명령어로 가상환경을 나간 상태에서 cd ..으로 상위 폴더로 나와 아래 명령어를 실행해주세요.

mkdir 02_2_param
cd 02_2_param
python -m venv venv
.\venv\Scripts\activate
pip install fastapi
pip install uvicorn
mkdir 02_2_param
cd 02_2_param
python -m venv venv
.\venv\Scripts\activate
pip install fastapi
pip install uvicorn

2. 경로 매개변수 사용하기

경로 매개변수를 사용하면 URL의 일부를 변수로 사용할 수 있습니다. 이를 통해 동적인 라우팅이 가능해집니다. main.py 파일을 다음과 같이 수정해보겠습니다.

from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/blog/{post_id}")
async def blog_detail(post_id: int):
    return {"게시물 번호": post_id + post_id}
from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/blog/{post_id}")
async def blog_detail(post_id: int):
    return {"게시물 번호": post_id + post_id}

이 예제에서 {post_id}는 경로 매개변수입니다. post_id: int는 이 매개변수가 정수형이어야 함을 명시합니다. 브라우저에서 http://127.0.0.1:8000/items/5에 접속하면 {"post_id": 5}라는 응답을 받게 됩니다.

read_post(post_id: int) 문법이 익숙치 않은 분도 있으실겁니다. 여기서 post_id는 경로 매개변수의 이름이며, int는 이 매개변수의 타입을 의미합니다. 이는 파이썬의 기본 문법이며, 아래와 같이 변수를 선언할 때 사용할 수 있습니다.

x: int = 5
y: str = "hello"
print(x + x)
print(y + y)
x: int = 5
y: str = "hello"
print(x + x)
print(y + y)

다만 파이썬에서는 타입힌트가 필수가 아니므로, 위와 같이 타입을 명시하지 않아도 되며 변수의 타입을 강제하지도 않습니다.

FastAPI에서는 타입힌트를 사용함으로써 자동으로 데이터 검증을 수행합니다. 따라서 FastAPI에서 일부 타입힌트는 필수사항이며 이를 통해 코드의 안정성을 높일 수 있습니다. 실습했었던 코드에서 타입힌트를 제외하고 실행해보세요.

from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/blog/{post_id}")
async def blog_detail(post_id):
    return {"게시물 번호": post_id + post_id}
from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/blog/{post_id}")
async def blog_detail(post_id):
    return {"게시물 번호": post_id + post_id}
uvicorn main:app --reload
uvicorn main:app --reload

여기서 타입힌트를 사용하지 않고 실행하면 문자열로 변환되어 연결되는 것을 확인할 수 있습니다. FastAPI에서는 타입힌트가 단지 가독성을 높이는 것 뿐만 아니라 실질적인 데이터 변환과 검증을 진행한다는 것을 알 수 있습니다.

3. 여러 경로 매개변수 사용하기

여러 개의 경로 매개변수를 동시에 사용할 수도 있습니다.

from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/blog/{post_tag}/{post_author}/")
async def tag_author_list(post_tag: str, post_author: str):
    return {"태그": post_tag, "저자": post_author}
from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/blog/{post_tag}/{post_author}/")
async def tag_author_list(post_tag: str, post_author: str):
    return {"태그": post_tag, "저자": post_author}

이 엔드포인트는 http://localhost:8000/blog/jeju/hojun와 같은 URL에 응답하며, {"태그": "jeju", "저자": "hojun"}를 반환합니다.

연습문제

  1. 처음에 기획된 URL 경로를 모두 구현하세요.

  2. "hello/{name}" 경로에 대한 GET 요청을 처리하는 엔드포인트를 만들어보세요. 이 엔드포인트는 주어진 이름을 사용하여 인사말을 반환해야 합니다.

  3. "/calculate/{operation}/{a}/{b}" 형식의 경로를 처리하는 엔드포인트를 만들어보세요. 여기서 operation은 "add", "subtract", "multiply", "divide" 중 하나이며, a와 b는 정수입니다. 해당 연산의 결과를 반환해야 합니다.

2.1 기본 라우팅2.3 요청 본문 처리