Backend/FastAPI

[FastAPI] 용어 정리

mopil 2022. 7. 12. 21:05
반응형

# 서론

FastAPI 프레임워크를 사용함에 있어 기본 개념과 용어 설명

 

* FastAPI 공식 문서 내용에서 가져옴

https://fastapi.tiangolo.com/ 

 

FastAPI

FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https://github.com/tiangolo/fastapi FastAPI is a modern, fast (high-performance), web framework for buil

fastapi.tiangolo.com

 

# 서버 구동

FastAPI 서버를 구동시키기 위해서는 다음과 같이 수행할 수 있다.

uvicorn main:app --reload

or

python uvicorn main:app --reload

--reload 옵션은 자원을 더 소모한다고 해서 개발환경 이외의 프로덕션 환경에서는 사용을 권장하지 않는다.

 

if __name__ == "__main__":
    uvicorn.run(app)

해당 코드를 작성하면, python main.py 로도 실행시킬 수 있다.

 

FastAPI의 디폴트 포트는 8000포트이다.

 

# Models

FastAPI 에서는 sqlalchemy를 활용하여 관계형 데이터베이스를 모델링하는데, sqlalchemy는 파이썬 진영 ORM 라이브러리다.

models는 FasrAPI에서 데이터베이스 테이블(스키마)를 뜻한다.

디렉토리를 나눠서 다음과 같이 설계한다.

class Photo(Base):
    __tablename__ = "photo"

    photo_id = Column(Integer, primary_key=True)
    filename = Column(String(255), default="unknown")
    type = Column(String(255), default="unknown")
    src = Column(String(255), default="unknown")  # 이미지 저장 경로
    created_time = Column(DateTime, default=datetime.now)


class Picture(Base):
    __tablename__ = "picture"

    picture_id = Column(Integer, primary_key=True)
    pic_src = Column(String(255), default="unknown")  # 실제 사진 저장 경로
    photo_src = Column(String(255), default="unknown")  # 그려진 그림 저장 경로
    comment = Column(String(255), default="unknown")
    created_time = Column(DateTime, default=datetime.now)

 

# Schemas

FastAPI는 pydantic이라는 라이브러리를 통해서 DTO 생성과 디비 상호작용을 돕는 객체를 손 쉽게 만들수 있도록 지원한다.

schemas는 FastAPI에서 DTO를 말한다. (데이터베이스 스키마와 용어 헷갈림 주의)

 

# 의존성 주입

FastAPI에서 데이터베이스와 상호작용이 필요한 경우, 컨트롤러단(main.py)에서 의존성을 주입하여 사용하기를 권장한다.

# Database Dependency
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

# 사진 업로드 후 꽃 분류
@app.post("/photo")
async def upload_photo(file: UploadFile, db: Session = Depends(get_db)):
    # 서버 로컬 스토리지에 이미지 저장
    UPLOAD_DIR = "./photo"

    content = await file.read()
    logging.info(f"original filename = {file.filename}")
    filename = f"{str(uuid.uuid4())}.jpg"
    with open(os.path.join(UPLOAD_DIR, filename), "wb") as fp:
        fp.write(content)
    src = f"{UPLOAD_DIR}/{filename}"

    # 꽃 분류
    result = classify(src)
    logger.info(f"classify results = {result}")

    # 디비에 저장
    db.add(Photo(filename=filename, src=src, type=flower_type))
    db.commit()

    db.query(Photo).filter_by(filename=filename).first()
    return result

이런식으로 FastAPI 에서 제공하는 Depends 함수를 활용해서 의존성을 주입받아서 사용할 수 있다.

 

 

반응형