Fastapi 사용법 mysql 연결, crud , 외부 api 연동

김하진·2022년 9월 13일
0

이번에, 운좋게 과제를 진행한 곳에서 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포트가 서버로 열린다!!

mysql 연결

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 연결은 생각보다 간단했다.

create!

@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 연동

과제중 외부 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 로 진행 해봐야 겠다.

profile
진킴

0개의 댓글