이번에, 운좋게 과제를 진행한 곳에서 fast-api 를 사용할 기회가 생겼다.
개인적으로 진행하면서 너무 재밌게, 많은 공부가 된 것 같다.
우선 패키지 관리를 poetry 로 하였는데 생각보다 어렵지 않다.
pip insatll poetry
를 한후,
poetry new 프로젝트명
으로 시작하면 된다!
그후 필요한 패키지는 poetry add fastapi
와 같이 추가를 하고,
poetry 에 있는 패키지를 받고 싶을때는 poetry install
을 하면된다!!
기존 requirements.txt 보다 훨씬 편하게 관리가 가능한 것 같다. 또한 pyenv 로버전관리를 하고 있는 나에게는 버전관리 까지 같이 되니 좀더 편한 느낌을 받았다!!
개인적으로 연습해본 것 위주로 작성 해 보겠다.
fastapi는 두가지를 다운 받아야한다
poetry add fastapi
poetry add uvicorn
app 이라는 폴더를 만들고 그안에 main.py 를 만든다. 서버를 실행할 파이썬 파일이다
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
기존적인 서버 실행 코드이다. 이제 터미널에 main.py 가 있는 경로로 이동을 하고
poetry run poetry run uvicorn main:app
을 실행하면 8000포트가 서버로 열린다!!
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
import json
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
SERECT_FILE = os.path.join(BASE_DIR, 'serects.json')
serects = json.loads(open(SERECT_FILE).read())
DB = serects["DB"]
DB_URL = f"mysql+pymysql://{DB['user']}:{DB['password']}@{DB['host']}/{DB['database']}?charset=utf8"
engine = create_engine(
DB_URL, encoding = 'utf-8'
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
docker 로 mysql 을 연동을 한다음 , serects.json에 mysql 정보를 넣어논 다음 연동시킨다음 db를 연결하면 끝이다! db 연결은 생각보다 간단했다.
@app.post("/users/{user_id}/items/", response_model=schemas.Item)
def create_item_for_user(
user_id: int, item: schemas.ItemCreate, db: Session = Depends(get_db)
):
return crud.create_user_item(db=db, item=item, user_id=user_id)
공식문서에서 가져온 간단하게 create 하는 함수이다. 플라스크 썻던 방식과 비슷한 방식이다. 틀을 토대로, 개발하는 방향으로 개발을 하면 될 것 같다. 자유도가 높아 보인다.
fastapi 스키마를 정의해서 올바른 데이터 형식이 들어오는지 확인 할 수 있다. schemas.py 에 미리 스키마를 정의 하고, 함수 명 옆에 타입을 스키마로 지정하면 그 타입에 대한 데이터만 받을 수 있다.
ex) schemas.py
class Item(ItemBase):
id: int
owner_id: int
class Config:
orm_mode = True
과제중 외부 api 에서 연동을 해야하는 과제가 있는데, 그에대한 연습을 미리 해보았다.
무선 httpx 를 import 해준다.
@app.get("/api_test/")
async def call_other_api() :
async with httpx.AsyncClient() as client:
response = await client.get(URL)
data = response.json()
arr = []
for i in range(len(data)):
if data[i]['name'] == "Lila Bahringer":
arr.append(data[i])
if arr == []:
raise HTTPException(status_code=400, detail="존재하지 않는 데이터 입니다.")
return arr
api 는 mockapi 라고 구글에 치면, 외부 api를 테스트 할 수 있는 사이트가 나온다. 그곳을 기반으로 api연동을 연습 해보았다.
후에, service 함수에서 외부 api 콜을 해보았는데 async 부분에서 계속 오류가 나서 async 없이 구현하였다. 이부분은 좀더 알아봐야 할 거 같다.
fastapi를 잠깐 써본 결과, 굉장히 쉽게 다가갈 수 있고, flask 와 django 를 경험한 사람이면 보다 편하게 다가갈 수 있는 프레임워크 인 것 같다. 속도도 빠르다고 하는데, 아직 체감을 해보진 못했다. 개인프로젝트는 fastapi 와typescript 로 진행 해봐야 겠다.