본문 바로가기

Fastapi

내맘대로 Fastapi docs 정리(Path, query parameters, request body)

Fastapi document를 보고 메모하는 블로그입니다.

fastapi document : https://fastapi.tiangolo.com/

 

FastAPI

FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https://github.com/tiangolo/fastapi FastAPI is a modern, fast (high-performance), web framework for buil

fastapi.tiangolo.com

 

  • my_awesome_api=FastAPI() in main.py -> uvicorn main:my_awesome_api --reload --host 0.0.0.0
  • --host는 접근할 수 있는 host를 지정해주는 것이고, --reload는 서버가 떠있는 상황에서 코드변화가 일어나면 자동으로 reload해주는 것이다.
  • PATH는 ENDPOINT 혹은 ROUTER라고 한다.
  • get, post, put, delete 뿐만 아니라 options, head, patch, trace도 있다. (ex: @app.options())
  • async def 대신에 def를 써도 되는데 그 이유는 async를 지정하지 않아도, fastapi 내부적으로 쓰레드풀이 있기 때문에 async하게 작동한다.

 

Path Parameters

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}


@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}
  •  users/me를 먼저 선언해야한다. 이유는 만약 {user_id}를 먼저 선언하면 me로 받을 수 있기 때문에.

 

 

@app.get("/users")
async def read_users():
    return ["Rick", "Morty"]

@app.get("/users")
async def read_users2():
    return ["Bean", "Elfo"]
  • 무조건 첫번째 path로만 들어온다.

 

@app.get("/users/{user_name}")
async def call_user(user_name: UserDto = Depends(UserDto)):
    return {"user": user_name}
  • path parameter를 특정 class로 depends하거나, 쓰이지 않을 경우에는 path_parameter 값은 필요가 없으므로, 아무 값이나 넣거나, swagger에서도 값을 받지 않는다.

 

class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"

app = FastAPI()

@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}

    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}

    return {"model_name": model_name, "message": "Have some residuals"}
  • str은 변수형을 설정(안해도된다). Enum은 ModelName['alexnet'](="alexnet"), ModelName.alexnet(="alexnet"), ModelName.alexnet.name(=alexnet), ModelName.alexnet.value(="alexnet")으로 사용 가능.
  • 만약 path parameter인 model_name에 enum을 제외한 값이 들어가면 422(Error: Unprocessable Entity)에러가 뜬다.

 

 

 

@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
    return {"file_path": file_path}
  • path parameter값이 /abc/def 처럼 /(슬래쉬)가 들어간 경우에는 위처럼 :path가 없으면 경로로 인식하여 404 not found 에러가 뜬다.
  • 따라서 저렇게 :path로 명시해주면 /(슬래쉬)가 들어가도 인식한다.

 

Query Parameters

@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
    if q:
        return {"item_id": item_id, "q": q}
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return {"item_id": item_id}
  • item_id = path parameter, q = query paramete ->  q는 Optional이기 때문에 쿼리로 넣어줘 도되고 안해도된다.
  • (q: Optional[str] = None) == python 3.6이상 (q: Union[str, None] = None) == python 3.10 이상 (q: str | None = None) 

 

 

 

Request Body

from pydantic import BaseModel
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    
app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item
  • pydantic의 BaseModel을 통해 enum 효과+다양한 자료형 -> request body에 Item 변수들이 포함되어야한다.
  • parameter가 path에 선언되었다면 path parameter로 인식된다.
  • parameter가 singular type이라면 (int, float, str, bool, ...) query parameter로 인식된다.
  • parameter가 pydantic type으로 선언되었다면, request body로 인식된다.

 

  • 다음과 같이 pydantic model은 여러가지 내부 함수를 제공해준다.