๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐™‹๐™ฎ๐™ฉ๐™๐™ค๐™ฃ/๐™๐™–๐™จ๐™ฉ ๐˜ผ๐™‹๐™„

Fast API ๊ณต๋ถ€ํ•ด๋ณด๊ธฐ #4 body ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ  ๋ฐ›๊ธฐ

by beomcoder 2023. 2. 23.
728x90
๋ฐ˜์‘ํ˜•
 

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 ๋ช…์„ธ์„œ์— ์˜ˆ์‹œ๋ฅผ ์ ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด๊ฒ ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€