본문 바로가기
Web 개발/FAST API (인프런 강의 내용)

1 실습2 GET API 단일조회

by yororing 2024. 4. 9.

앞 단계 참조 링크:

현재 파일 내용:

# todos > src > main.py 파일 내용

from fastapi import FastAPI

app = FastAPI()

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

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,
    },
}

@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

 

02 단일 ToDo 조회하기 (GET Method 사용)

  • 목표: GET Method를 이용해 기존에 있는 단일 ToDo 내용 조회하기 

1. main.py에 쓰기

# todos > src > main.py
...
@app.get("/todos/{todo_id}")			# @app.get("/path/subpath")
def get_todo_handler(todo_id: int):		# def 핸들러명(받을값: 데이터형태):
	return todo_data.get(todo_id, {})		# return 데이터.get(키값, 없을경우반환값)

1) 해당 path에 GET 요청을 보내는 API 생성

  • @app.get("/todos/{todo_id}")
    • app에 GET Method를 매핑
    • todos path의 서브 path로 {todo_id} 지정 
    • 중괄호({ }) 안에 적을 시 path로 이용 가능
  • def get_todo_handler(todo_id: int):  
    • get_todo_handler라는 함수(핸들러) 생성
    • todo_id path를 int 형태의 인자로 전달받아 사용하도록 설정
  • return todo_data.get(todo_id, {})
    • get 이용하여 todo_id todo_data의 key 값들을 조회하여 해당 value를 반환
    • 없을 경우 빈 딕셔너리{ }를 반환하도록 기본값 설정
  • 작동 방식:
    • @ 뒤에 있는 app (앞서 app=FastAPI() 선언하여 가능)이라는 FastAPI 서버에 "/todos/{todo_id}" path로 개인 요청을 보내게 되면 아래에 있는 get_todo_handler() 함수가 실행되어서 해당 API 요청을 처리할 것
    • get_todo_handler () API는 int 형태의 todo_id key 값을 받았을 때 해당 value 값을 반환해주는 기능을 지님

2. FastAPI 웹 서버 재시작하기 (--reload 옵션 사용) 

  • 웹 서버 실행 후 코드 변경 시 변경사항을 SwaggerUI에 반영하기 위해선 웹 서버 재시작 (uvicorn 종료 후 다시 실행) 필수
  • 종료 방법: Ctrl + C
  • 다시 실행:  uvicorn main:app --reload
$ 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 [10592] using StatReload
INFO:     Started server process [8756]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
  • reload 옵션
    • 코드 변화가 감지되면 자동으로 서버를 FastAPI가 재시작 됨
    • 코드 수정 시 서버를 내렸다 올렸다를 하지 않고 --reload 옵션을 이용하여 개발 진행 가능

3. SwaggerUI 및 화면 확인

1) API 확인

  • 브라우저에 http://127.0.0.1:8000/todos/1 입력 시 → 허용된 값, 존재하는 키 값
  •  

  • 브라우저에 http://127.0.0.1:8000/todos/4 입력 시 → 허용된 값, 존재하지 않는 키 값
  •  

  • 브라우저에 http://127.0.0.1:8000/todos/s 입력 시 → 허용되지 않는 값 (int가 아님), 존재하지 않는 키 값
  •  

  • 허용된 값 (int) 안 줬다고 에러 메세지 나옴

2) Swagger 문서 확인

  • 브라우저에 http://127.0.0.1:8000/docs 입력 시
  •  

  • 이 중,
  •  

  • query parameter로 todo_id가 있는 todos/{todo_id}를 통해 단일 todo 조회하는 API 만들어진 것 확인
  • Try it out 버튼 클릭 수 todo_id 값에 원하는 값들을 넣어서 Execute 클릭 시 출력값 확인 가능

 

이때까지의 코드들:

# .../todos/src/main.py 내용

from fastapi import FastAPI

app = FastAPI()

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

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,
    },
}

@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

@app.get("/todos/{todo_id}")
def get_todo_handler(todo_id: int):
    return todo_data.get(todo_id, {})

 

'Web 개발 > FAST API (인프런 강의 내용)' 카테고리의 다른 글

1 실습4 PATCH API todo 수정  (0) 2024.04.16
1 실습3 POST API todo 생성  (0) 2024.04.15
1 실습1 GET API 전체조회  (0) 2024.04.05
1 FastAPI 알아보기  (0) 2024.03.26
0 오리엔테이션  (0) 2024.03.26