앞 단계 참조 링크:
- 프로젝트 소개 및 환경 구축: 2024.04.05 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습1 GET API 전체조회
- 1 실습1 GET API ToDo 전체 조회: 2024.04.05 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습1 GET API 전체조회
- 1 실습2 GET API ToDo 단일 조회: 2024.04.09 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습2 GET API 단일조회
- 1 실습3 POST API ToDo 생성: 2024.04.15 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습3 POST API todo 생성
- 1 실습4 PATCH API ToDo 수정: 2024.04.16 - [Web 개발/FAST API (인프런 강의 내용)] - 1 실습4 PATCH API todo 수정
현재 파일 내용:
# /todos/src/main.py 내용
from fastapi import FastAPI, Body
from pydantic import BaseModel
app = FastAPI()
# 첫 화면 API
@app.get("/")
def health_check_handler():
return {"ping": "pong"}
# POST 생성을 위해 사용자로부터 전달받을 request 클래스 생성
class CreateToDoRequest(BaseModel):
id: int
contents: str
is_done: bool
# 데이터베이스 역할하는 딕셔너리 생성
todo_data = {
1: {
"id": 1,
"content": "실전! FastAPI 섹션 0 수강",
"is_done": True,
},
2: {
"id": 2,
"content": "실전! FastAPI 섹션 1 수강",
"is_done": False,
},
3: {
"id": 3,
"content": "실전! FastAPI 섹션 2 수강",
"is_done": False,
},
}
# GET Method 사용하여 전체 조회 API
@app.get("/todos")
def get_todos_handler(order: str | None = None):
rt = list(todo_data.values())
if order and order == "DESC":
return rt[::-1]
return rt
# GET Method 사용하여 단일 조회 API
@app.get("/todos/{todo_id}")
def get_todo_handler(todo_id: int):
return todo_data.get(todo_id, {})
# POST Medthod 사용하여 todo 생성 API
@app.post("/todos")
def create_todos_handler(request: CreateToDoRequest):
todo_data[request.id] = request.dict()
return todo_data[request.id]
# PATCH Method 사용하여 is_done 값 수정 API
@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 {}
05 기존 ToDo 삭제하기 (DELETE Method 사용)
- 목표: DELETE Method를 이용해 기존에 있는 ToDo를 삭제하는 API 만들기
1. main.py에 쓰기
1) DELETE Method Mapping 및 해당 path에 DELETE 요청을 보내는 API 생성
# todos > src > main.py
from fastapi import FastAPI, Body
from pydantic import BaseModel
...
@app.delete("/todos/{todos_id}")
def delete_todo_handler(todo_id: int):
todo_data.pop(todo_id, None)
return todo_data
- @app.delete("/todos/{todos_id}")
- app에 DELETE Method를 매핑
- todos 에 {todo_id}를 path로 받음
- def delete_todo_handler(todo_id: int):
- delete_todo_handler 라는 함수(핸들러) 생성
- todo_data.pop(todo_id, None)
- todo_data (todo 목록)에서 todo_id를 찾아 .pop()을 사용하여 todo_id에 해당하는 데이터(todo 정보) 삭제
- todo_id가 todo_data에 없을 경우 default 값으로 None을 반환
- None을 기본값으로 안 줄 경우 사용자로부터 전달 받은 todo_id가 todo_data에 없으면 에러남
- return todo_data
- 해당 데이터가 삭제된 todo_data를 반환
2. FastAPI 웹 서버 자동 재시작 (--reload 옵션 사용)
- 웹 서버 실행 후 코드 변경 시 변경사항을 SwaggerUI에 반영하기 위해선 웹 서버 재시작 (uvicorn 종료 후 다시 실행) 필수
- reload 옵션 사용 시 변화가 감지되면 자동으로 서버를 FastAPI가 재시작 됨
- 방금 수정한 main.py를 저장 (ctrl + S) 하면 자동으로 재시작되어 변경사항이 반영됨
- 우선 시작 안했으면 시작하기
$ cd /c/Users/관리자/Desktop/projects/todos/src
$ uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['C:\\Users\\관리자\\Desktop\\projects\\todos\\src']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [2792] using StatReload
INFO: Started server process [15928]
INFO: Waiting for application startup.
INFO: Application startup complete.
- 시작 후 문서를 변경했으면 저장하기 (Ctrl + S)
WARNING: StatReload detected changes in 'main.py'. Reloading...
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [15888]
Process SpawnProcess-2:
Traceback (most recent call last):
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\asyncio\base_events.py", line 684, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
asyncio.exceptions.CancelledError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 314, in _bootstrap
self.run()
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\site-packages\uvicorn\_subprocess.py", line 78, in subprocess_started
target(sockets=sockets)
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\site-packages\uvicorn\server.py", line 65, in run
return asyncio.run(self.serve(sockets=sockets))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Users\관리자\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 123, in run
raise KeyboardInterrupt()
KeyboardInterrupt
INFO: Started server process [15964]
INFO: Waiting for application startup.
INFO: Application startup complete.
3. SwaggerUI 및 화면 확인
1) Swagger 문서 확인
- 브라우저에 http://127.0.0.1:8000/docs 입력 또는 새로고침 시
- DELETE API가 추가된 것 확인
2) Swagger 문서에서 DELETE API 실습
- DELETE 클릭 > Try it out 클릭
- todo_id 값으로 존재하는 값 (예, 1 또는 2 또는 3) 넣기
- Execute 클릭 시
- Server response를 보면 'todo_id' 값이 2인 todo 데이터가 삭제된 후 나머지 데이터들이 반환된 것을 확인
이때까지의 코드들:
# .../todos/src/main.py 내용
from fastapi import FastAPI, Body
from pydantic import BaseModel
app = FastAPI()
# 첫 화면 API
@app.get("/")
def health_check_handler():
return {"ping": "pong"}
# POST 생성을 위해 사용자로부터 전달받을 request 클래스 생성
class CreateToDoRequest(BaseModel):
id: int
contents: str
is_done: bool
# 데이터베이스 역할하는 딕셔너리 생성
todo_data = {
1: {
"id": 1,
"content": "실전! FastAPI 섹션 0 수강",
"is_done": True,
},
2: {
"id": 2,
"content": "실전! FastAPI 섹션 1 수강",
"is_done": False,
},
3: {
"id": 3,
"content": "실전! FastAPI 섹션 2 수강",
"is_done": False,
},
}
# GET Method 사용하여 전체 조회 API
@app.get("/todos")
def get_todos_handler(order: str | None = None):
rt = list(todo_data.values())
if order and order == "DESC":
return rt[::-1]
return rt
# GET Method 사용하여 단일 조회 API
@app.get("/todos/{todo_id}")
def get_todo_handler(todo_id: int):
return todo_data.get(todo_id, {})
# POST Medthod 사용하여 todo 생성 API
@app.post("/todos")
def create_todos_handler(request: CreateToDoRequest):
todo_data[request.id] = request.dict()
return todo_data[request.id]
# PATCH Method 사용하여 is_done 값 수정 API
@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 {}
# DELETE Method 사용하여 todo 아이템 삭제 API
@app.delete("/todos/{todo_id}")
def delete_todo_handler(todo_id: int):
todo_data.pop(todo_id, None)
return todo_data
'Web 개발 > FAST API (인프런 강의 내용)' 카테고리의 다른 글
2 데이터베이스 (0) | 2024.04.24 |
---|---|
1 실습6 ERROR 처리 (0) | 2024.04.18 |
1 실습4 PATCH API todo 수정 (0) | 2024.04.16 |
1 실습3 POST API todo 생성 (0) | 2024.04.15 |
1 실습2 GET API 단일조회 (0) | 2024.04.09 |