본문 바로가기
Python/API

Fast API Tutorial(3): query parameters

by 고독한석사생 2024. 2. 24.

전체 코드

from fastapi import FastAPI
from enum import Enum
from typing import Optional

app = FastAPI()

@app.get("/", description='this is our first roote')
async def base_get_roote():
    return {"message":"hello world"}

@app.post("/")
async def post():
    return {"message":"hello from the post roote"}

@app.put("/")
async def put():
    return {"message":"hello from the put roote"}



@app.get("/users")
async def list_users():
    return {"message":"list users route"}

@app.get("/users/{user_id}")
async def get_user(user_id: str):
    return {"user_id":user_id}

@app.get("/users/me")
async def get_current_user():
    return {"message":"this is the current user"}



class FoodEnum(str, Enum):
    fruits = "fruits"
    vegetables = "vegetables"
    diary = "dairy"


@app.get("/foods/{food_name}")
async def get_food(food_name: FoodEnum):
    if food_name == FoodEnum.vegetables:
        return {"food_name":food_name, "message":"you are healthy"}

    if food_name.value == "fruits":
        return {"food_name":food_name, "message":"you are still healthy, but like sweet things"}
   
    return {"food_name":food_name, "message":"I like chocolate milk"}



fake_items_db = [
    {"item_name":"Foo"},
    {"item_name":"Bar"},
    {"item_name":"Baz"}
    ]

@app.get("/items")
async def list_items(skip: int = 0, limit: int = 10):
    return fake_items_db[skip:skip+limit]

@app.get("/items/{item_id}")
async def get_item(item_id: str, sample_query_param:str, q: str | None = None, short: bool = True):
    item = {"item_id":item_id, "sample_query_param":sample_query_param}
    if q:
        item.update({"q":q})
    if short:
        item.update(
            {
                "description":"hi man~"
                }
        )
    return item


@app.get("/users/{user_id}/items/{item_id}")
async def get_user_item(user_id: int, item_id: str, q:str | None = None, short:bool=True):
    item = {"item_id":item_id, "owner_id":user_id}
    if q:
        item.update({"q":q})
    if short:
        item.update(
            {
                "description":"hi girl~"
            }
        )
    return item

 

이전에는 필수로 넣어야되는 path parameters를 실습했다면,

이번에는 옵션으로 넣어보는 query parameters를 실습해보자

 

실습1

간단하게 복습도 할겸 query parameters 원리에 대해 살펴보자

skpi 인덱스번호로부터 limit개 만큼 fake_item_db객체에서 추출
디폴트 값 확인(skip:0, limit:10)
디폴트는 skip이 0, limit이 10이다
디폴트 값에 따라 전부 출력됨을 확인할 수 있음
path parameters 뒤에 ?를 붙여 query parameters를 정해준 결과 1번쨰 인덱스부터 차례대로 2개의 리스트가 반환

 

이렇게 ?뒤에 아무것도 query parameters를 정의하지 않으면 디폴트 값이 반영되고, 정의하면 그 값이 반영되어 결과를 반환한다

 

실습2

그럼 query parameters가 optional한지 코드와 눈으로 살펴보기로 하자

@app.get("/items/{item_id}")
async def get_item(item_id: str, q: str | None = None):
    if q:
        return {"item_id": item_id, "q":q}
    return {"item_id": item_id}

 

 

쿼리를 적으니 아래 response body에서도 결과가 둘 다 나온다

 

query 파라미터인 q를 적지 않으니, item_id에 해당하는 부분만 반환된다

 

 

 

실습3

@app.get("/items/{item_id}")
async def get_item(item_id: str, q: str | None = None, short: bool = True):
    item = {"item_id":item_id}
    if q:
        item.update({"q":q})
    if short:
        item.update(
            {
                "description":"hi man~"
                }
        )
    return item

 

위에 것을 한 번 다음과 같이 변경해보았다.

q가 있으면 item을 업데이트하는 식으로 구조를 변경했다. 

short인자는 bool형태이며, short가 True일 경우, description을 추가해 최종 item을 반환한다

 

short가 false인 경우, 결과 키에 description이 없다

 

 

item_id만 넣었을 경우, query가 없기 때문에 q키는 없으며, short는 디폴트 값이 True이므로 description 키가 나타나게 된다

 

 

@app.get("/items/{item_id}")
async def get_item(item_id: str, sample_query_param:str, q: str | None = None, short: bool = True):
    item = {"item_id":item_id, "sample_query_param":sample_query_param}
    if q:
        item.update({"q":q})
    if short:
        item.update(
            {
                "description":"hi man~"
                }
        )
    return item

 

여기서 sample_query_param이라는 것을 인자에 추가해서 다시 확인해보면, 아래처럼 required인 것을 확인할 수 있다

query parameter도 required로 지정해줄 수 있다

 

 

실습4

@app.get("/users/{user_id}/items/{item_id}")
async def get_user_item(user_id: int, item_id: str, q:str | None = None, short:bool=True):
    item = {"item_id":item_id, "owner_id":user_id}
    if q:
        item.update({"q":q})
    if short:
        item.update(
            {
                "description":"hi girl~"
            }
        )
    return item

 

path parameters는 required로 표기되는 것을 확인

반응형

'Python > API' 카테고리의 다른 글

Fast API Tutorial(3.5): toy project(calculator)  (0) 2024.03.01
Fast API Tutorial(2): path parameters  (0) 2024.02.23
Fast API Tutorial(1): introduction  (0) 2024.02.23