FastAPI 공식문서 따라하기

코드늘보·2024년 9월 27일

본 포스팅은 한글번역판 FastAPI 공식문서인 자습서-사용자안내서를 보고 정리하는 글 입니다.
https://fastapi.tiangolo.com/ko/tutorial/

파이썬 설치 생략

fast-app이라는 이름으로 폴더 생성

pipenv로 가상환경 설정 후 활성화하기

#가상환경에서 fastapi uvicorn 설치
pipenv install fastapi uvicorn

# 설치 확인 
pip list 

fast-app 경로에 main.py 파일 생성

#main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
  return {"Hello FastAPI"}
  
# 실행
uvicorn main:app --reload

url에 localhost:8000 입력

특정 경로 설정하고 주소값의 매개변수(파라미터)를 전달하기

@app.get("/items/{item_id}")
def read_items(item_id):
	return {"item:" item_id}

주소창에 물건1을 입력하면 items페이지에 값이 전달된다.

변수의 타입 지정하기

@app.get("/items/{item_id}")
def read_items(item_id: int):
	return {"item:" item_id}

item_id를 int 자료형으로 지정해주고나면
문자를 매개변수로 전달 할 경우 오류 메시지가 발생한다.

매개변수를 전달하는 주소와 그렇지 않는 주소 순서 처리문제

user/me라는 페이지 주소가 있고, user/{user_id}로 매개변수를 전달하는 주소도 있다고 가정하였을 때 me라는 값을 매개변수가 아닌 하부 경로로 설정하고 싶다면 매개변수 전달하는 함수 위로 코드를 작성하여야 적용된다.

# 매개변수 전달함수 아래 /me 주소를 붙이는 경우
@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

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

me가 매개변수로 인식되어 전달되었다.

# 매개변수 전달함수 위로 /me 경로를 추가한 경우
@app.get("/users/me")
async def read_user_me():
    return {"대충 현재 로그인된 유저 정보"}
    
@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

me가 변수가 아니라 하위 경로로 적용되고 페이지내 로직이 실행된다.

Enum 타입설정해서 특정 변수만 받아서 처리해보기
(변수를 한글로 입력하는 것은 좋지 않지만 가독성을 위해 입력해보았습니다.)

Enum 타입을 선언하고 마동석, 김혜수, 원빈만 주소 값으로 허용하기로 했다.
models/{modelName} 주소에 값을 입력하면 해당 배우 명대사를 반환한다.
공식문서에서는 주소 파라미터 값을 확인하는 세가지 방법을 제공한다.

from fastapi import FastAPI
from enum import Enum

class ModelName(str, Enum):
  마동석 = "마동석"
  김혜수 = "김혜수"
  원빈 = "원빈"

app = FastAPI()

@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name is ModelName.마동석:
        return {"model_name": model_name, "message": "진실의 방으로."}

    if model_name.value == "김혜수":
        return {"model_name": model_name, "message": "쏠 수 있어."}

    if model_name.원빈.value == "원빈":
      return {"model_name": model_name, "message": "아직 한발 남았다."}
    
    return {"model_name": model_name, "message": "Have some residuals..."}

만약에 ModelName Enum 클래스에 선언하지 않은 값을 넣으면 오류가 발생한다.

URL에 파일경로를 입력하는 방법
매개변수 경로에서 주소를 path로 명시하고
매개변수를 문자열 타입으로 지정한다.

파일경로를 반환하는 코드

@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
    return {"file_path": file_path} 
profile
쉬운 코드를 지향합니다.

0개의 댓글