이 글은 Fast API 공식문서를 기반으로 학습한 내용들을 정리한 글이다
모든 학습 자료들은 아래 링크에서 찾아볼 수 있다
https://fastapi.tiangolo.com/

쿼리 매개변수
쿼리는 URL의 일부분으로 URL에서 ?로 시작하는 부분부터 쿼리라고 볼 수 있다.
일반적으로 키 = 값 형태로 구현되어 있으며 각각의 키 = 값은 &로 구분한다.
https://fastapi.tiangolo.com/?type=post&value=10
위 예시 URL에서의 쿼리를 봤을 때는 type 값은 'post', value는 10 값을 가진다
FastAPI 에서는 쿼리 값은 다음과 같은 코드로 사용 가능하다.
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, limit 값이 있다면 해당 값이 할당되고, 없다면 코드에서 지정해준 기본값인 0, 10이 할당되어 계산된다.
선택적 매개변수
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Union[str, None] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
Union 을 사용하면 선택적으로 값을 지정할 수 있다. q는 기본적으로 None 값이 되고 만약 쿼리에 str 타입의 q 값이 있다면 해당 값이 할당된다.
Request Body
Request Body는 클라이언트에서 보내는 요청과 함께 오는 데이터이다. API를 호출할 때, Response Body는 항상 클라이언트에 보내줘야하지만 Request Body의 경우 필수는 아니다. 그러므로 따로 코드로 설정을 해줘야한다. FastAPI에서는 보통 Pydantic을 사용한다.
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
Pydantic의 BaseModel을 상속받아 데이터 모델(클래스)를 만들어주면 이를 데이터 검증(Validation)에 사용하게 된다.
근데 대체 Pydantic의 BaseModel이 뭐길래 데이터 모델을 class로 선언해줄 때 상속 받는 것일까?
그냥 상속 받지 않고 Class를 내 맘대로 선언해줘도 될 것 같지만... 아니다 FastAPI 공식문서에서도 꼭 쓰는 이유가 있다.
Pydantic에 대해서는 다음 글에서 다뤄볼 예정이다.
FastAPI에서 Request Body를 받는 과정을 간략히 설명하면 다음과 같다.
- Requset Body를 JSON 형식으로 받는다.
- 선언한 데이터 모델을 통해 Validation이 이루어진다.
- 매개변수에 Validation을 마친 데이터를 할당해준다.
이때 주의사항은 클라이언트에서 보내는 Request Body 내부의 변수명과 FastAPI에서 받는 매개변수 명이 같아야 정상적으로 값이 할당된다는 것이다. 위 코드를 예시로 들면 item이라는 매개변수에 Request Body에서 받아온 데이터를 할당하는데, 클라이언트에서 보내는 변수명도 item이어야한다는 것이다. 개인적으로 프로젝트를 진행하면서 변수명을 정확하게 안 맞추는 실수 때문에 고생을 많이 했었다...
'백엔드 > FastAPI' 카테고리의 다른 글
| [FastAPI] Pydantic이란? (0) | 2022.09.29 |
|---|---|
| [FastAPI] FastAPI 스터디 #2 (0) | 2022.07.08 |
| [FastAPI] FastAPI 스터디 #1 (0) | 2022.05.24 |