본문 바로가기
개발/파이썬 백엔드 프레임워크

Fast API 공부해보기 #2 경로 동작 생성

by beomcoder 2023. 2. 22.
728x90
반응형
 

Fast API 공부해보기 #1 특징 및 설치

백엔드로 Django, flask만 사용하다가 가볍게 사용하기에 Fast API도 좋다고 하여 한번 공부해보려고 한다. 주요 특징은 다음과 같다고 한다. 우선은 라이브러리를 설치해주었다. from fastapi import FastAPI

beomcoder.tistory.com

from fastapi import FastAPI

app = FastAPI()

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

여기서 동작은 '/' 다음에 오는 부분을 말한다.

https://example.com/items/foo  에서 /items/foo 를 경로라고 말한다.

from fastapi import FastAPI

app = FastAPI()


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

이제 한번 경로 매개변수를 사용해볼까 한다.

{ }로 묶으면 경로가 아니라 매개변수가 된다. 그래서 item_id라는 변수로 값을 받게 된다.

 

그리고 http://127.0.0.1:8000/items/foo 라고 인터넷창에 쳐보면 잘 받아온다.

 

여기서 경로에 써진 것들은 전부 string형이다. 하지만 숫자를 한번에 받아오고 싶을때도 있다.

그러면 매개변수에 타입을 지정해주어 데이터 변환을 하면 된다.

 

from fastapi import FastAPI

app = FastAPI()


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

이렇게 쓰면 좋은점은 원하는 타입으로만 받을 수 있다.

상대방이 int형인데 문자를 입력한다면 에러메시지를 출력시켜 잘못 보냈다고 알려준다.

int형으로 선언했기 때문에 float형도 타입을 잘못 보냈다고 알려준다.

 

docs를 확인해보면 우리가 함수를 적기만 했을 뿐인데 문서가 자동으로 만들어졌다.

어떤 식으로 호출해야하는지 알려주고 item_id는 필수라고 알려주고 int타입에 path에 적어야 한다고 알려준다.

 

여기서 이제 문제가 하나 생긴다.

만약 /users/login 로 로그인을 하고, /users/{id} 로 유저를 확인한다고 가정해보자.

 

그렇다면 순서를 /users/login 을 먼저 작성해주어야 한다.

코드는 위에서부터 아래로 읽기 때문에 if문을 생각해보면 된다.

n = 10

if n > 0:
	print('if')
elif n> 5:
	print('elif')

n은 10이라서 if와 elif를 둘다 만족하지만 먼저 위에서 만족해서 elif를 가지 않는다.

마찬가지로 데코레이터도 같은 방식이다.

 

from fastapi import FastAPI

app = FastAPI()


@app.get("/users/login")
async def user_login():
    return True


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

이렇게 적는다면 login을 먼저 확인하기 때문에 문제가 없다.

미리 변수값들을 정해줄 수도 있다. 지금은 user_id가 아무값이나 들어가도 괜찮았다.

 

from enum import Enum
from fastapi import FastAPI

class VersionName(str, Enum):
    v5 = "v5"
    v7 = "v7"
    v8 = "v8"

app = FastAPI()

@app.get("/models/yolo{model_name}")
async def get_model(model_name: VersionName):
    if model_name is VersionName.v5:
        return {"version_name": model_name, "message": "v5!"}

    if model_name.value == "v7":
        return {"model_name": model_name, "message": "v7!"}

    return {"model_name": model_name, "message": "v8!"}

YOLO 버전에서 내가 현재 가지고 있지 않는 버전을 불렀으면 에러를 호출한다.

다음은 이제 REST API로 한번 사용해보려고 한다.

728x90
반응형

댓글