-
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