본문 바로가기

웹 프레임워크/FastAPI

FastAPI - 20 (APIRouter)

APIRouter

FastAPI 애플리케이션의 경로 작업(route operations)을 구조화하고 모듈화 합니다.

예제 코드를 작성합니다.

디레토리 및 파일 구조

. main.py
└── service
    ├── notice
    ├──── notice_route.py
    ├── qna
    └──── qna_route.py

notice_route.py

/service/notice 경로에 대한 경로 작업을 정의합니다.

# 웹 서비스의 경로(엔드포인트)를 생성
from fastapi import APIRouter

# APIRouter의 인스턴스를 생성.
# URL 접두어로 /service/notice를 사용
# 이 라우터에 정의된 모든 경로가 이 URL 접두어로 시작됨을 의미합니다
router = APIRouter(prefix="/service/notice")

# 공지사항 변수 선언 및 초기화
_notices = [
    {"id": 1, "title": "Notice 1", "content": "This is the content of Notice 1."},
    {"id": 2, "title": "Notice 2", "content": "This is the content of Notice 2."}
]

# /service/notice/에 대한 GET 요청
@router.get("/")
def get_all_notices():
    # 모든 공지사항을 반환
    return _notices

# 경로 매개변수 /{notice_id}를 포함한 GET 요청의 라우트를 정의
@router.get("/{notice_id}")
def get_notice(notice_id: int):
    # _notices 리스트를 loop를 돌면서 id가 notice_id와 일치하는 첫 번째 공지사항을 return
    notice = next((notice for notice in _notices if notice["id"] == notice_id), None)
    # 공지사항이 있다면
    if notice:
        return notice
    # 공지사항이 없다면
    return {"message": "Notice not found"}, 404

qna_route.py

/service/qna 경로에 대한 경로 작업을 정의합니다.

from fastapi import APIRouter

router = APIRouter(prefix="/service/qna")

_qna = [
    {"id": 1, "title": "Qna 1", "content": "This is the content of Qna 1."},
    {"id": 2, "title": "Qna 2", "content": "This is the content of Qna 2."}
]

@router.get("/")
def get_all_qnas():
    return _qna

@router.get("/{qna_id}")
def get_qna(qna_id: int):
    qna = next((qna for qna in _qna if qna["id"] == qna_id), None)
    if qna:
        return qna
    return {"message": "Qna not found"}, 404

main.py

FastAPI 애플리케이션의 메인 파일입니다.
/service/notice 경로와 /service/qna 경로를 import 합니다.

from fastapi import FastAPI

# 조금 전 작성 한 service 디렉토리의 notice_route.py와 qna_route.py를 import
from service.notice import notice_route
from service.qna import qna_route

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Hello World"}


# notice_route를 main 애플리케이션 app에 포함
app.include_router(notice_route.router)
app.include_router(qna_route.router)

실행 및 테스트

FastAPI 애플리케이션을 실행합니다.

uvicorn main:app --reload

notice route 테스트

공지사항 목록을 가져오겠습니다.

http://localhost:8000/service/notice/

APIRouter(prefix="/service/notice")로 지정한 prefix인 /service/notice로 접속합니다.

notice_route에 의해 def get_all_notices(): 함수가 실행되어 공지사항 리스트가 반환됩니다.


공지사항 1번을 가져오겠습니다.

http://localhost:8000/service/notice/1

notice id 1을 경로 매개변수로 지정하여 접속합니다.

공지사항 1번에 대한 정보가 반환됩니다.

qna route 테스트

qna 목록을 가져오겠습니다.

http://localhost:8000/service/qna/

APIRouter(prefix="/service/qna")로 지정한 prefix인 /service/qna로 접속합니다.

qna 목록이 반환됩니다.


qna 1번을 가져오겠습니다.

http://localhost:8000/service/qna/1

qna 1번에 대한 정보가 반환됩니다.