본문 바로가기
개발/FastAPI

[FastAPI] FastAPI 시작하기 Request Body~Parameter Validations

by devhooney 2023. 5. 16.
728x90

회사에서 Python + FastAPI로 개발을 하게 되었다.

그래서 공식문서를 훑어보았다.

 

1. Request Body

클라이언트(예: 브라우저)에서 API로 데이터를 보내야 할 때 request body으로 보낸다.
넘길 파라미터가 한, 두개 면 그냥 넘기고 받으면 되지만, 넘길 파라미터가 많으면 코드량이 많아진다.

 

Request Body는 클라이언트에서 API로 보내는 데이터.

Response Body는 API가 클라이언트로 보내는 데이터.

 

- main.py

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


app = FastAPI()


@app.post("/items/")
async def create_item(item: Item):
    return item

 

BaseModel은 Pydantic 모듈에서 제공하는 클래스로, 데이터 모델링과 유효성 검사를 쉽게 할 수 있게 해준다.

이를 사용하여 데이터 스키마를 정의하고, 데이터 유효성 검사를 수행하며, JSON 직렬화 및 역직렬화도 수행할 수 있다. BaseModel 클래스를 상속받아 필드를 정의하고, 필요한 메서드를 추가하여 사용한다.

 

{
    "name": "a",
    "description": "aaa",
    "price": 1,
    "tax": 1
}

{
    "name": "b",
    "price": 1
}

 

description과 tax는 필수 요소가 아니기 때문에 데이터를 'b'처럼 삭제해도된다.

 

테스트는 docs에서 하면 편하다.

 

2. Query parameter 검증

Request Body를 BaseModel로 검증했던 것 처럼 Parameter도 검증이 가능하다.

- main.py

from typing import Union

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    item_id: int = Path(title="The ID of the item to get"),
    q: Union[str, None] = Query(default=None, alias="item-query"),
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

Path, Query를 이용해서 Swagger Docs에 설명을 추가할 수 있다.

 

- 파라미터가 str인 경우

@app.get("/items/")
async def read_items(
    q: Annotated[
        str | None, Query(min_length=3, max_length=50, regex="^fixedquery$")
    ] = None
):
...

최소길이, 최대길이, 정규식을 이용해 검증 처리했다.

Parameter가 지정된 제약 조건을 충족하지 않으면 FastAPI는 자동으로 422 Unprocessable Entity 응답을 반환한다.

 

- 파라미터가 int인 경우

@app.get("/items/{item_id}")
async def read_items(item_id: int = Path(title="The ID of the item to get", ge=1)):
...

ge는 크거나 같다. e는 같다. le는 작거나 같다를 뜻한다.

 

 

728x90