FastAPI [1] – 라우팅, 요청 바디, 경로 파라미터, 쿼리 파라미터

라우팅

  • 클라이언트가 서버로 보내는 HTTP 요청을 처리하는 프로세스이다.
  • HTTP 요청이 지정한 라우트 핸들러로 전송되면 미리 정의된 로직이 해당 요청을 처리해서 반환한다.

FastAPI의 라우팅

from fastapi import APIRouter

router = APIRouter()


@router.get("/hello")
async def say_hello() -> dict:
    return {
        "message": "Hello!"
    }
  • fastapi의 APIRouter 클래스는 다중 라우팅을 위한 경로 처리 클래스이다.
  • APIRouter 클래스를 통해 라우팅과 로직을 독립적으로 구성할 수 있다.
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def welcome() -> dict:
    return {
        "message": "Hello World!"
    }

app.include_router(router)
  • APIRouter 클래스는 FastAPI 클래스와 동일한 방식으로 작동하지만 uvicorn으로 실행하려면 메인 애플리케이션에 include_router메서드를 통해 라우터를 인스턴스로 추가해줘야 한다.
  • uvicorn 실행 커맨드
    • uvicorn main:app --port 8000 --reload

Request body(요청 바디)

from pydantic import BaseModel

class Todo(BaseModel):
    id: int
    item: str
  • 악의적인 공격의 위험을 막고, 요청 바디의 데이터가 적절한지 확인하기 위해 pydantic을 사용할 수 있다.
  • pydantic이란?
    • 파이썬의 type annotation을 사용해서 데이터를 검증하는 파이썬 라이브러리이다.
  • 스웨거 문서(애플리케이션 주소 뒤 /docs를 붙인 주소)에서 정보를 확인할 수 있다.
  • 리독 문서(애플리케이션 주소 뒤 /redoc를 붙인 주소)에서도 확인이 가능하다.
class Todo(BaseModel):
    id: int
    item: str

    class Config:
        schema_extra = {
            "example": {
                "id": 1,
                "item": "Example Schema"
            }
        }
  • 샘플 데이터는 모델 클래스 안에 Config 클래스로 정의하면 된다.

Path parameters(경로 매개변수)

@todo_router.get("/todo/{todo_id}")
async def get_single_todo(todo_id: int) -> dict:
    for todo in todo_list:
        if todo.id == todo_id:
            return {
                "todo": todo
            }
    return {
        "message": "Todo with supplied ID doesn't exist."
    }
  • 요청의 경로 매개변수{todo_id}로 받은 값을 라우터 함수에서 활용할 수 있다.

Path 클래스

from fastapi import Path


@todo_router.get("/todo/{todo_id}")
async def get_single_todo(todo_id: int = Path(..., title="The ID of the todo to retrieve.")) -> dict:
    for todo in todo_list:
        if todo.id == todo_id:
            return {
                "todo": todo
            }
    return {
        "message": "Todo with supplied ID doesn't exist."
    }
  • Path 클래스는 라우트 함수의 다른 인수와 경로 매개변수를 구분하는 역할을 한다.
  • 스웨거 문서에서 관련 정보를 조금 더 명확하게 문서화 해준다.
  • Path(..., kwargs)
    • 첫 인수를 …로 지정하면 경로 매개변수를 반드시 지정해야 한다.
    • gt, le와 같은 검증 기호를 사용할 수 있다.

Query parameters(쿼리 매개변수)

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]
  • 경로 매개변수가 아닌 값들은 자동으로 쿼리 매개변수가 된다.
  • 요청의 쿼리 매개변수 skip, int로 받은 값을 라우터 함수에서 활용할 수 있다.
    • http://127.0.0.1:8000/items/?skip=0&limit=10

Query 클래스

from typing import Annotated

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Annotated[str | None, Query(max_length=50)] = None):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • Query 클래스와 Annotated를 사용하면 쿼리 매개변수에 대한 정보를 제공하고 검증을 더 쉽게 할 수 있다.
  • https://fastapi.tiangolo.com/tutorial/query-params-str-validations

Leave a Reply

Your email address will not be published. Required fields are marked *