예시 코드를 먼저 확인해봅시다.
from fastapi import FastAPI, APIRouter
# 1
app = FastAPI(
title="Recipe API", openapi_url="/openapi.json"
)
# 2
api_router = APIRouter()
# 3
@api_router.get("/", status_code=200)
def root() -> dict:
"""
Root Get
"""
return {"msg": "Hello, World!"}
# 4
app.include_router(api_router)
# 5
if __name__ == "__main__":
# Use this for debugging purposes only
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8001, log_level="debug")
app
인스턴스 선언api_router
인스턴스 선언app.include_router
메소드로 app
인스턴스에 api_router
를 등록(register)왜 FastAPI랑 APIRouter가 분리되어 있을까?
- 간단한 프로젝트의 경우 FastAPI 객체만 사용해도 무방(객체 자체의 역할은 비슷함)
- router가 여러 개일 경우
main.py
에서
- FASTAPI 인스턴스를 선언하고
- 각기 다른 router는 다른 module로부터 import해서
- 한곳에 추가하는 역할
- 마지막에 uvicorn을 통해 서버 run
@api_router.get("/search/", status_code=200) # 3
def search_recipes(
keyword: Optional[str] = None, max_results: Optional[int] = 10 # 4 & 5
) -> dict:
위에서 keyword
및 max_results
가 keyword parameter이다.
- 이것이 URL에서는 아래와 같이 표시될 것이다.
http://localhost:8001/search/?keyword=chicken&max_results=2
keyword parameter는 type 과 default가 명시되기도 한다.(이 때 typing
module에 의해 Optional
한 argument가 정의되기도 한다.
Query
class예시)
keyword: Optional[str] = Query(None, min_length=3, example="chicken"),