본문 바로가기
Fast API/fastapi배우기

Fast API 배우기 5부 - Path 클래스

by 붕어사랑 티스토리 2021. 10. 21.
반응형

앞서 Query 클래스로 Query Parameter를 다루는법을 배웠다

 

똑같에 Path 클래스로 Path Parameter를 좀더 심도있게 다룰 수 있다

 

 

 

Metadata 선언하기

Query와 똑같이 title 에 메타데이터를 넣어주면 된다

    item_id: int = Path(..., title="The ID of the item to get"),
from typing import Optional

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    item_id: int = Path(..., title="The ID of the item to get"),
    q: Optional[str] = Query(None, alias="item-query"),
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

 

 

 

 

 

숫자 제한하기

Query와 Path 는 앞서 배운 강의에서 문자열 기일이도 제한할 수 있지만 숫자도 제한할 수 있다.

 

다음은 우리가 배울 내용이다

 

  • ge : greater than or equal, 크거나 같다
  • gt : greater than, 크다
  • lt : less than, 작다
  • le : less than or equal, 작거나 같다
from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *, item_id: int = Path(..., title="The ID of the item to get", ge=1), q: str
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results
from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(..., title="The ID of the item to get", gt=0, le=1000),
    q: str,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results
from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
    q: str,
    size: float = Query(..., gt=0, lt=10.5)
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

 

반응형

 

원하는대로 파라미터 순서 정하기

 

(개 쓸데없는 내용이고 알아도 비 실용적이므로 다음으로 넘어가는거 추천)

 

 

상황을 가정하자 

 

당신이 q:str 변수를 쿼리 파라미터로 쓰려고 한다

별다른 메타데이터도 필요 없어서 Query 클래스를 사용하지 않을거다

그리고 당신은 item_id 라는 Path parameter를 Path 클래스로 선언하려고 한다

 

 

그러면 다음과 같은 문제가 생긴다.

 

파이썬에서는 함수인자에서 default value를 가진 변수가 default value를 가지지 않은 변수보다 앞에오면 에러를 일으킨다.

 

예를들면

 

def func(a=10,b):    => 에러

def func(a,b=10)     => OK

 

위와 같은 상황이 발생한다. 고로 당신은 위의 예제에서 q를 item_id보다 먼저 앞에 둬야한다

 

 

from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(

    q: str, item_id: int = Path(..., title="The ID of the item to get")

):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

 

 

하지만 당신이 q를 뒤로 보내고 싶다면?

 

정답은 * 인자를 함수 맨 앞으로 놓으면 된다.

 

from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(

    *, item_id: int = Path(..., title="The ID of the item to get", ge=1), q: str

):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

 

하지만 단점이 있다. * 뒤에 오는 변수들은 key-value로 인자를 넣어줘야 한다.

반응형

댓글