컴퓨터 프로그래밍/FastAPI

[FastAPI] CRUD

한33 2025. 3. 13. 13:16

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def health_check_handler():
    return {"ping":"pong"}

todo_data = {
    1: {
        "id": 1,
        "contents": "한대규의 오늘 할 일1",
        "is_done": True
    },
    2: {
        "id": 2,
        "contents": "한대규의 오늘 할 일2",
        "is_done": False
    },
    3: {
    "id": 3,
        "contents": "한대규의 오늘 할 일3",
        "is_done": False
    }
}

✔️ GET 요청

전체 조회

# 할 일 전체 조회
@app.get("/todos")
def get_todos_handler(order: str | None = None):
    ret = list(todo_data.values())
    if order == "DESC":
        return ret[::-1]
    return ret

 

FastAPI 에서는 Query Parameter 를 함수의 인자로 전달한다.

order 를 str 타입으로 받을 수 있고, | None = None 을 통해서 Query Parameter 를 전달받지 못하면 그대로 todo_data 를 반환한다.

 

단일 조회

# 할 일 단일 조회
@app.get("/todos/{todo_id}")
def get_todo_handler(todo_id: int):
    return todo_data.get(todo_id, {})

 

todo_id 를 int 타입으로 받고 todo_data 에서 get 메서드를 통해 todo_id 와 key 값이 같은 데이터를 가져오고, 만약  없다면 빈 {} 를 반환한다.

 

✔️ POST요청

from pydantic import BaseModel
class CreateTodoRequest(BaseModel):
    id: int
    content: str
    is_done: bool
# 할 일 생성
@app.post("/todos")
def create_todo_handler(request: CreateTodoRequest):
    todo_data[request.id] = request.dict()
    return

 

POST 요청 시에 RestBody 를 받아와야하는데, pydantic 라이브러리의 BaseModel 클래스를 활용한다.

CreateTodoRequest 함수를 만들어준다. (dto 역할을 함)

그리고 create_todo_handler 에서 request 를 CreateTodoRequest 함수로 지정을 해주고 key 는 request 의 id 값을, value 는 request 를 넣어준다.

 

✔️ PATCH요청

# 할 일 수정
@app.patch("/todos/{todo_id}")
def update_todo_handler(
        todo_id: int,
        is_done: bool = Body(..., embed=True),
):
    todo = todo_data.get(todo_id)
    if todo:
        todo["is_done"] = is_done
        return todo
    return {}

 

Patch 메서드에서는 todo_id 를 Parameter 로 받고 RequestBody 에서 is_done 을 받아서 수정하도록 설정했다.

받아온 todo_id 로 todo_data 에서 get 메서드를 활용해 매치시켜 todo 변수에 저장했고

 

만약 todo 가 있다면 todo 의 is_done 값을 새로 받은 is_done 으로 업데이트 시키고 todo 를 반환시킨다.

todo 가 없다면 빈 dictionary {} 를 반환시키도록 설정했다.

 

✔️ DELETE요청

# 할 일 삭제
@app.delete("/todos/{todo_id}")
def delete_todo_handler(todo_id: int):
    todo_data.pop(todo_id, None)
    return todo_data