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
그리고 로컬서버로 접속!
API docs 에 접속하기
아래 링크로 접속해보자. 그럼 API 사이트가 자동으로 만들어져 있다
이게 뭐하는 사이트인고 한다면
docs는 여러분이 만든 백엔드를 테스트 할 수 있는 페이지이다.
그리고 fastapi의 강력한 기능중 하나이다!
그리고 또 아래 링크로 접속하자. 아래버전은 다른버전의 api라고 한다.
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은 위 예제에서 열거형 자료형인걸 기억하자
'Fast API > fastapi배우기' 카테고리의 다른 글
Fast API 배우기 6부 - Body 클래스 (0) | 2021.10.21 |
---|---|
Fast API 배우기 5부 - Path 클래스 (0) | 2021.10.21 |
Fast API 배우기 4부 - Query 클래스 (0) | 2021.10.20 |
Fast API 배우기 3부 - Request Body (0) | 2021.10.20 |
Fast API 배우기 2부 - query parameters (0) | 2021.10.19 |
댓글