Fast API 공부해보기 #3 pydantic, query, request body
Fast API 공부해보기 #2 경로 동작 생성 Fast API 공부해보기 #1 특징 및 설치 백엔드로 Django, flask만 사용하다가 가볍게 사용하기에 Fast API도 좋다고 하여 한번 공부해보려고 한다. 주요 특징은 다음과
beomcoder.tistory.com
body에 대해서 조금더 자세하게 공부해보려 한다.
from typing import Union
from fastapi import FastAPI, Path
from pydantic import BaseModel
app = FastAPI() # FastAPI()를 app이라는 이름으로 사용한다.
class Item(BaseModel): # pydantic의 BaseModel을 상속받아 사용한다.
name: str # name이라는 변수는 필수로 적어주고, string형이여야 한다.
description: Union[str, None] = None # 설명은 적어도 되고, 적지 않아도 된다.
price: float # price는 float형으로 필수로 적어주어야 한다.
tax: Union[float, None] = None # 세금은 float형으로 적거나, None으로 적어도 된다.
@app.put("/items/{item_id}")
async def update_item( #비동기로 함수를 선언한다.
*, # *표시로 기본값이 없는 변수와, 있는 변수의 순서를 고민안해도 된다.
item_id: int = Path(title="The ID of the item to get", ge=0, le=1000),
# item_id는 int형이어야 하고 경로매개변수에 적어주어야한다. 0<= item_id <=1000
q: Union[str, None] = None,
item: Union[Item, None] = None,
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
if item:
results.update({"item": item})
return results
먼저 예시 코드 리뷰를 해보면 내가 저번 시간에 배웠던게 잘 들어왔는지 확인 할 수 있다.
착각한게 있었다. Query를 적어주어야 쿼리문으로 적는지 알았는데,
그냥 BaseModel을 사용하여 class를 만들어주지 않으면 쿼리로 적어주어야 된다.
q는 경로에 item_id 다음에 ?q="here" 이라고 적어주어야 된다.
body에 "q": "test"라고 계속 적어도 update가 되지 않아서 한참 헤맸다.
여기서 또 한가지 더 배운게 있다.body에 Item 모델 하나만 있다면 "item": { }으로 묶으면 안된다.
무슨 뜻이냐면지금 받아오는 값에서 item_id는 패스경로, q는 쿼리문으로 받기 때문에 body에는 item밖에 없다.
그래서 위와 같이 body를 적어주었는데 에러가 났다. 그래서 "item"으로 감싸놓은걸 풀었더니 됐다.
body에 자기 자신만 있을 경우에는 감싸놓은걸 풀어야 한다.
근데 여기서 body에 자기 자신밖에 없지만 item:{} 으로 감싸는게 당연하다고 생각했다.방법은 있다.
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(embed=True)):
results = {"item_id": item_id, "item": item}
return results
item: Item = Body(embed=True)로 적어주면 된다.
q를 body에 보내게 하고 싶은데 모델을 적고 싶지 않다면 방법이 있다.
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
class User(BaseModel):
username: str
full_name: Union[str, None] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, user: User, importance: int = Body()):
results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
return results
importance : int = Body()로 적으면 된다.
그리고 모델을 여러개 만들었는데, 다 사용하고 싶으면 class로 쓰고 싶은 만큼 적어주면 된다.
아까는 item : {} 으로 묶어주지 않았는데 body에 자기 자신만 있는 경우가 아니라면
이번에는 묶어주어야 한다.
body에서 보내더라도 Query, Path처럼 조건을 달 수 있다.
Field를 사용하는 방법이다.
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str
description: Union[str, None] = Field(
default=None, title="The description of the item", max_length=300
)
price: float = Field(gt=0, description="The price must be greater than zero")
tax: Union[float, None] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(embed=True)):
results = {"item_id": item_id, "item": item}
return results
다음은 API 명세서에 예시를 적어주는 방법에 대해 공부해보겠다.
'개발 > 파이썬 백엔드 프레임워크' 카테고리의 다른 글
Fast API로 백엔드서버 만들기 [1] (1) | 2023.10.26 |
---|---|
Fast API 공부해보기 #3 pydantic, query, request body (0) | 2023.02.23 |
Fast API 공부해보기 #2 경로 동작 생성 (0) | 2023.02.22 |
Fast API 공부해보기 #1 특징 및 설치 (0) | 2023.02.22 |
댓글