본문 바로가기
Fast API/fastapi배우기

Fast API 배우기 1부 - 시작 및 path parameter

by 붕어사랑 티스토리 2021. 10. 18.
반응형

Fast API란?

  • 파이썬 웹 프레임워크중 가장 빠른속도를 지닌 프레임워크. Node.js와 Go와 속도가 맞먹는다
  • 속도만 빠를뿐만 아니라 개발속도도 미치도록 빠르다
  • 인터넷에 자료는 적지만 그걸 커버쳐줄만큼 document가 잘되어있다

 

1. 설치

두줄이면 끝. 쉽쥬?

pip install fastapi
pip install "uvicorn[standard]"

 

 

2. Hello World 출력하기

말도 안되게 간단하쥬?

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

 

아래 커맨드로 실행해보자

uvicorn main:app --reload

그리고 로컬서버로 접속!

 

http://127.0.0.1:8000

 

 

 

API docs 에 접속하기

 

아래 링크로 접속해보자. 그럼 API 사이트가 자동으로 만들어져 있다

http://127.0.0.1:8000/docs

 

 

 

이게 뭐하는 사이트인고 한다면

 

docs는 여러분이 만든 백엔드를 테스트 할 수 있는 페이지이다.

 

그리고 fastapi의 강력한 기능중 하나이다!

 

 

 

 

그리고 또 아래 링크로 접속하자. 아래버전은 다른버전의 api라고 한다.

 

http://127.0.0.1:8000/redoc

 

 

 

Open API

위의 페이지는 fast api는 OPEN API를 이용해 스키마를 자동 작성해준 것이다.

 

 

스키마란?

어떤것을 서술했다 라는 의미이다. 한마디로 데이터베이스를 어떻게 구성했냐를 말한다

 

API 스키마

여기서 api란 fastapi로 작성한 서버가 어떻게 생겨먹었는지 라고 생각해주면 된다.

Open API라는 툴을 이용해 여러분의 서버가 어떻게 생겼는지를 보여준다. 위에 docs에 들어간것 처럼

 

Data 스키마

데이터의 Json형식이 어떻게 생겨먹었는지를 나타낸다.

 

 

 

 

 

 

Operation

fast api에서 operation은 HTTP의 method를 의미한다.

 

즉 아래와 같다

  • POST : 데이터를 생성할떄 쓴다
  • GET : 데이터를 얻어올때 쓴다
  • PUT : 데이터를 업데이트 할 때 쓴다
  • DELETE : 데이터를 지울 떄 쓴다

 

Path Parameter

위예제에서 아래 코드는 path parameter를 의미한다.

사용법은 중괄호로 묶어준다.

 

@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}

 

 

Path Parameter의 타입 정하기

아래처럼 타입을 명시해주어 path parameter의 타입을 강제화 시켜줄 수 있다.

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

 

만약 item_id에 int형을 제외한 다른 데이터 타입을 들어갈 경우 에러가 난다

 

http://127.0.0.1:8000/items/foo 에 접속했다고 치자. foo는 int가 아니니 아래처럼 에러가 난다.

 

{
    "detail": [
        {
            "loc": [
                "path",
                "item_id"
            ],
            "msg": "value is not a valid integer",
            "type": "type_error.integer"
        }
    ]
}

 

 

반응형

 

Path operation의 순서

아래의 예제를 보자

 

여러분이 path로

 

/users/me

/users/{user_id}

 

이 두개를 만들었다고 하자.

from fastapi import FastAPI

app = FastAPI()


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


@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

 

만약 리퀘스트로 /users/me 가 들어온다면 위 두개의 get 데코레이션중 어느 함수를 택해야 할 까?

 

정답은 path를 등록할때 실행순서는 등록한 순서대로 실행되기 때문에 위에 read_user_me 함수가 실행된다.

 

만약 두 함수의 순서를 바꿀경우 read_user 함수가 실행된다. 고로 순서에 주의하자

 

 

 

Predefined value로 리퀘스트 체크하기

만약 미리 정해진 값으로 리퀘스트를 체크하는 로직을 만들고 싶으면 fast api에서는 파이썬의 enum을 사용하라고 권장한다.

 

from enum import Enum

from fastapi import FastAPI


class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"


app = FastAPI()


@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}

    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}

    return {"model_name": model_name, "message": "Have some residuals"}

 

여기서 주목할점은 아래 코드이다. 리퀘스트도 미리 정해진 값으로 forcing 할 수 있다.

 

async def get_model(model_name: ModelName):

 

 

Open API에 들어가서 확인해보면 try it 사용시 인풋이 아래처럼 제한된 걸 볼 수 있다.

 

 

 

몇가지 주목할점을 보자

 

현재 enum자료형의 값을 보려면 value 프로퍼티를 꺼내면 된다

    if model_name.value == "lenet":

 

 

리턴형의로 enum 자료형을 넘겨주면 fast api에서 알아서 번역해서 json으로 만들어 준다

 

        return {"model_name": model_name, "message": "Deep Learning FTW!"}

위 model_name은 위 예제에서 열거형 자료형인걸 기억하자

 

 

 

 

반응형

댓글