Backend/FastAPI
[FastAPI] 용어 정리
mopil
2022. 7. 12. 21:05
반응형
# 서론
FastAPI 프레임워크를 사용함에 있어 기본 개념과 용어 설명
* FastAPI 공식 문서 내용에서 가져옴
# 서버 구동
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 함수를 활용해서 의존성을 주입받아서 사용할 수 있다.
반응형