ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FastAPI - 요청 본문, 검증, Pydantic (쿼리)
    Backend 2025. 10. 21. 20:40

    I. 요청 본문

    - Client -> API (응답 본문은 거꾸로)

     

    - Pydantic 사용

     

    - Pydantic

        a. Basebodel import

        b. Data model 선언: 

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

       (None으로 선택적으로 만듦)

        c. 매개변수로서 선언: 앞의 내용과 동일 (async def create_item(iten: Item):)

        d. 함수 내에서 모델 객체의 all attributes에 접근 가능 (item.tax)

        

    - 요청 본문 & 경로 매개변수 & 쿼리 매개변수 동시 선언 가능

     

    - Body 매개변수를 이용할 수도 있음.

     

    II. 쿼리 매개변수 & 문자열 검증

    async def read_items(q: Union[str, None] = None):

    - async def read_items(q: Union[str, None] = None): -> q 선택 (Optional[str] 이지만 기본값 None)

     

    - q의 길이 상한 정하려면: 기본값이 Query(default=None, max_length = 50)

        -> None = Query(None)

     

    - q의 길이 하한 정하려면: 기본값이 Query(default=None, min_length = 50)

     

    - Regex (정규표현식)

    . 문자 한개 {n, m} n~m회 반복
    ^ 이전에 문자 없고, 뒤따르는 문자로 시작함 \d 숫자
    $ 끝나는 지점, 이후에 아무 문자도 갖지 않음 \w 문자, 숫자, _
    * 0개 이상 반복 (ab* -> a, ab, abb...) \s 공백 문자
    + 1개 이상 반복 (ab+ -> ab, abb, abbb...) [...] 괄호 안 문자 중 하나
    ?  0개 또는 1개 (ab? -> a, ab) [^...] 괄호 제외 문자
    {n} n회 반복 , Or

     

    pattern = '12{2, 4}^admin$\w'

        처럼 Query 안에 넣어주기

     

    - 기본값: default로 다른 값도 전달 가능

     

    - 필수로 만들기: Query는 맨 앖에 type이 없으면 None으로 선언하므로, 필수로 만들려면 앖에 ellipsis(...)로 주기

     

    - 쿼리 매개변수 리스트 & 다중값: 값들을 리스트 or other ways로 여러 값 받기 가능

    async def read_items(q: Union[List[str], None] = Query(default=None)):
    	query_items = {"q": q}
        return query_items

       와 같이 가능

        (/items/?q=foo&q=bar 와 같은 URL)

     

    - 쿼리 매개변수 리스트 & 기본값 사용하는 다중값

        a. Query(default=["foo", "bar"])과 같이 기본값 지정

        b. 그냥 list도 사용 가능 (list = Query())

            -> 여기에서는 list 검사 x

     

    - Other Metadatas

        a. title

        b. description

     

    - 별칭 매개변수: item-query와 같은 비문도 alias 사용하면 가능 (alias = "item-query")

     

    - 매개변수 사용하지 않기: deprecated=True를 Query로 전달

     

    III. 경로 매개변수와 숫자 검증

    - 경로 임포트: Path를 import

     

    - 메타데이터 선언: Query에 동일한 매개변수 선언

        -> 경로 언제나 필수, eilipsis로 선언

     

    - 매개변수 정렬: 

    @app.get("/items/{item_id}")
    async def read_items(q: str, item_id: int = Path(title="hi"))

    원래 기본값 없는 변수를 있는 변수 앞에 두면 문제 but FastAPI에서는 자동정렬.

     

    - 정렬 트릭: q가 기본값이 되기 원하지 않지만 순서를 바꾸고 싶으면, 첫 번째 매개변수를 *로 지정

        -> 그럼 따르는 매개변수 모두 kwargs(키 - 값 쌍)

     

    - 숫자 검증

    async def read_items(
        *, item_id: int = Path(title="The ID of the item to get", ge=1), q: str
    ):

        a. ge: greater or equal

        b. gt: greater than

        c. le: less than or equal

        d. lt: less than

     

    IV. 쿼리 매개변수 모델

    class FilterParams(BaseModel):
        limit: int = Field(100, gt=0, le=100)
        offset: int = Field(0, ge=0)
        order_by: Literal["created_at", "updated_at"] = "created_at"
        tags: list[str] = []

    - 필요한 Query Param을 pydantic 모델 내부에 설정, 모델을 query로 설정

     

    - 추가 쿼리 매개변수 금지: Pydantic 설정에서 extra를 forbid로 설정

    model_config = {"extra": "forbid"}

        -> 추가적인 데이터 보내려고 하면 클라이언트는 에러를 받음

    'Backend' 카테고리의 다른 글

    FastAPI - Body (다중 매개변수, 필드, 중첩 모델)  (0) 2025.10.25
    FastAPI - 매개변수  (0) 2025.10.16
Designed by Tistory.