๐ฐ FastAPI ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๊ฐ์ธ์ ์ผ๋ก ์ ๋ฆฌํ ๊ธ ์
๋๋ค.
์๋ต ๋ชจ๋ธ
FastAPI๋ response_model์ ์ฌ์ฉํ์ฌ ์๋ต์ ์ํ ๋ชจ๋ธ์ ์ ์ธํ ์ ์๋ค.
- @app.get()
- @app.post()
- @app.put()
- @app.delete()
- Etc
response_model์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ป๋๋ค.
- ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํ์ ์ ์ธ์ผ๋ก ๋ณํ
- ๋ฐ์ดํฐ ๊ฒ์ฆ
- OpenAPI ๊ฒฝ๋ก ์๋์ ์๋ต์ JSON ์คํค๋ง ์ถ๊ฐ
- ์๋ ์์ฑ ๋ฌธ์ ์์คํ ์ ์ฌ์ฉ
- ํด๋น ๋ชจ๋ธ์ ์ถ๋ ฅ ๋ฐ์ดํฐ ์ ํ
from typing import Any, Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
# SignIn model
class UserIn(BaseModel):
usename: str
password: str # ์ค์ ํจ์ค์๋๋ ์ ๋ ํ๋ฌธ์์ฑ X
email: EmailStr
full_name: Union[str, None] = None
# User Info Output
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: Union[str, None] = None
# reponse_model์ UseOut ๋ชจ๋ธ๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์
# ๋น๋ฐ๋ฒํธ๋ฅผ ํฌํจํ์ง ์์ ๊ฐ์ ์๋ตํจ.
@app.post('/user/', response_model=UserOut)
async def create_user(user: UserIn) -> Any:
return user
์ด์ฒ๋ผ response_model์ ๋ชจ๋ธ์ ์ง์ ํ๋ฉด ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ์๋ต๊ฐ๋ง ํํฐ๋งํด์ ๋ณด์ฌ์ค ์ ์๋ค.
์ถ๊ฐ๋ก response_model_exclude_unset์ ์ฌ์ฉํ์ฌ ์๋ต ๋ชจ๋ธ์์ unset์ํ(๊ฐ์ด ํ ๋น๋์ง ์์ ์ํ)์ ํ๋๋ฅผ ์ ์ธํ์ฌ ์ถ๋ ฅํ ์ ์๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์๋ต๊ฐ์ด ์์ฒญ ๊ธด ๊ฒฝ์ฐ ํ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ ์ ์๋ค.
from typing import List, Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: float = 10.5
tags: List[str] = []
items = {
"foo": {"name": "Foo", "price": 50.2},
"bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},
"baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []},
}
@app.get("/items/{item_id}", response_model=Item, response_model_exclude_unset=True)
async def read_item(item_id: str):
return items[item_id]
/items/foo๋ฅผ ํ๋ฉด ์์ฒญ์ผ๋ก {"name":"Foo", "price":50.2}๊ฐ ๊ฐ๊ฒ๋๊ณ response_model_exclude_uset=True ๋๋ถ์ ๊ธฐ๋ณธ๊ฐ์ด ์ค์ ๋ ๋๋จธ์ง ๊ฐ๋ค์ ์ ์ธํ ์๋ต์ ํ๋ค.
Multiple ๋ชจ๋ธ
์ฌ๋ฌ๊ฐ์ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋ณด์์ฑ์ ๋์ผ ์ ์๋ค.
ํ์๊ฐ์ ๊ณผ์ ์ ์์๋ก ์ดํด๋ณด์.
from typing import Union, Any
from hashlib import sha256
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
class UserIn(BaseModel):
id: str
pw: str
email: EmailStr
fullName: Union[str, None] = None
class UserOut(BaseModel):
id: str
email: EmailStr
fullName: Union[str, None] = None
class UserDB(BaseModel):
id: str
hashPW: Any
email: EmailStr
fullName: Union[str, None] = None
def toHash(password: str) -> Any:
return sha256(password.encode())
def saveUser(user: UserIn) -> UserDB:
hashPW = toHash(user.pw)
fakeDB = UserDB(**user.model_dump(), hashPW=hashPW)
print("Save User in DB")
return fakeDB
@app.post("/user/", response_model=UserOut)
def signIN(user: UserIn) -> UserOut:
result: UserDB = saveUser(user)
return result
'Back-end & Server > FastAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FastAPI] ๊ฒฝ๋ก ์๋ ์ค์ (0) | 2024.02.20 |
---|---|
[FastAPI] Form (0) | 2024.02.20 |
[FastAPI] ๋งค๊ฐ๋ณ์ (0) | 2024.02.20 |
[FastAPI] ๋์์ฑ๊ณผ async / await (0) | 2024.02.19 |
[FastAPI] ํ์ ์ง์ , Pydantic (0) | 2024.02.19 |